mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-28 23:11:21 +00:00
Merge pull request #12969 from opensourcerouting/ospfd-nssa
ospfd: implement NSSA default routes & ranges
This commit is contained in:
commit
4af5e39b2c
@ -325,7 +325,6 @@ Areas
|
||||
announced to other areas. This command can be used only in ABR and ONLY
|
||||
router-LSAs (Type-1) and network-LSAs (Type-2) (i.e. LSAs with scope area) can
|
||||
be summarized. Type-5 AS-external-LSAs can't be summarized - their scope is AS.
|
||||
Summarizing Type-7 AS-external-LSAs isn't supported yet by FRR.
|
||||
|
||||
.. code-block:: frr
|
||||
|
||||
@ -431,6 +430,31 @@ Areas
|
||||
configured not to advertise forwarding addresses into the backbone to direct
|
||||
forwarded traffic to the NSSA ABR translator.
|
||||
|
||||
.. clicmd:: area A.B.C.D nssa default-information-originate [metric-type (1-2)] [metric (0-16777214)]
|
||||
|
||||
.. clicmd:: area (0-4294967295) nssa default-information-originate [metric-type (1-2)] [metric (0-16777214)]
|
||||
|
||||
NSSA ABRs and ASBRs can be configured with the `default-information-originate`
|
||||
option to originate a Type-7 default route into the NSSA area. In the case
|
||||
of NSSA ASBRs, the origination of the default route is conditioned to the
|
||||
existence of a default route in the RIB that wasn't learned via the OSPF
|
||||
protocol.
|
||||
|
||||
.. clicmd:: area A.B.C.D nssa range A.B.C.D/M [<not-advertise|cost (0-16777215)>]
|
||||
|
||||
.. clicmd:: area (0-4294967295) nssa range A.B.C.D/M [<not-advertise|cost (0-16777215)>]
|
||||
|
||||
Summarize a group of external subnets into a single Type-7 LSA, which is
|
||||
then translated to a Type-5 LSA and avertised to the backbone.
|
||||
This command can only be used at the area boundary (NSSA ABR router).
|
||||
|
||||
By default, the metric of the summary route is calculated as the highest
|
||||
metric among the summarized routes. The `cost` option, however, can be used
|
||||
to set an explicit metric.
|
||||
|
||||
The `not-advertise` option, when present, prevents the summary route from
|
||||
being advertised, effectively filtering the summarized routes.
|
||||
|
||||
.. clicmd:: area A.B.C.D default-cost (0-16777215)
|
||||
|
||||
|
||||
|
312
ospfd/ospf_abr.c
312
ospfd/ospf_abr.c
@ -54,6 +54,7 @@ static void ospf_area_range_free(struct ospf_area_range *range)
|
||||
}
|
||||
|
||||
static void ospf_area_range_add(struct ospf_area *area,
|
||||
struct route_table *ranges,
|
||||
struct ospf_area_range *range)
|
||||
{
|
||||
struct route_node *rn;
|
||||
@ -64,7 +65,7 @@ static void ospf_area_range_add(struct ospf_area *area,
|
||||
p.prefix = range->addr;
|
||||
apply_mask_ipv4(&p);
|
||||
|
||||
rn = route_node_get(area->ranges, (struct prefix *)&p);
|
||||
rn = route_node_get(ranges, (struct prefix *)&p);
|
||||
if (rn->info)
|
||||
route_unlock_node(rn);
|
||||
else
|
||||
@ -75,10 +76,12 @@ static void ospf_area_range_delete(struct ospf_area *area,
|
||||
struct route_node *rn)
|
||||
{
|
||||
struct ospf_area_range *range = rn->info;
|
||||
bool nssa = CHECK_FLAG(range->flags, OSPF_AREA_RANGE_NSSA);
|
||||
|
||||
if (range->specifics != 0)
|
||||
if (ospf_area_range_active(range) &&
|
||||
CHECK_FLAG(range->flags, OSPF_AREA_RANGE_ADVERTISE))
|
||||
ospf_delete_discard_route(area->ospf, area->ospf->new_table,
|
||||
(struct prefix_ipv4 *)&rn->p);
|
||||
(struct prefix_ipv4 *)&rn->p, nssa);
|
||||
|
||||
ospf_area_range_free(range);
|
||||
rn->info = NULL;
|
||||
@ -87,11 +90,12 @@ static void ospf_area_range_delete(struct ospf_area *area,
|
||||
}
|
||||
|
||||
struct ospf_area_range *ospf_area_range_lookup(struct ospf_area *area,
|
||||
struct route_table *ranges,
|
||||
struct prefix_ipv4 *p)
|
||||
{
|
||||
struct route_node *rn;
|
||||
|
||||
rn = route_node_lookup(area->ranges, (struct prefix *)p);
|
||||
rn = route_node_lookup(ranges, (struct prefix *)p);
|
||||
if (rn) {
|
||||
route_unlock_node(rn);
|
||||
return rn->info;
|
||||
@ -133,11 +137,12 @@ struct ospf_area_range *ospf_area_range_lookup_next(struct ospf_area *area,
|
||||
}
|
||||
|
||||
static struct ospf_area_range *ospf_area_range_match(struct ospf_area *area,
|
||||
struct route_table *ranges,
|
||||
struct prefix_ipv4 *p)
|
||||
{
|
||||
struct route_node *node;
|
||||
|
||||
node = route_node_match(area->ranges, (struct prefix *)p);
|
||||
node = route_node_match(ranges, (struct prefix *)p);
|
||||
if (node) {
|
||||
route_unlock_node(node);
|
||||
return node->info;
|
||||
@ -153,7 +158,7 @@ struct ospf_area_range *ospf_area_range_match_any(struct ospf *ospf,
|
||||
struct listnode *node;
|
||||
|
||||
for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area))
|
||||
if ((range = ospf_area_range_match(area, p)))
|
||||
if ((range = ospf_area_range_match(area, area->ranges, p)))
|
||||
return range;
|
||||
|
||||
return NULL;
|
||||
@ -169,17 +174,13 @@ static int ospf_area_actively_attached(struct ospf_area *area)
|
||||
return area->act_ints;
|
||||
}
|
||||
|
||||
int ospf_area_range_set(struct ospf *ospf, struct in_addr area_id,
|
||||
struct prefix_ipv4 *p, int advertise)
|
||||
int ospf_area_range_set(struct ospf *ospf, struct ospf_area *area,
|
||||
struct route_table *ranges, struct prefix_ipv4 *p,
|
||||
int advertise, bool nssa)
|
||||
{
|
||||
struct ospf_area *area;
|
||||
struct ospf_area_range *range;
|
||||
|
||||
area = ospf_area_get(ospf, area_id);
|
||||
if (area == NULL)
|
||||
return 0;
|
||||
|
||||
range = ospf_area_range_lookup(area, p);
|
||||
range = ospf_area_range_lookup(area, ranges, p);
|
||||
if (range != NULL) {
|
||||
if (!CHECK_FLAG(advertise, OSPF_AREA_RANGE_ADVERTISE))
|
||||
range->cost_config = OSPF_AREA_RANGE_COST_UNSPEC;
|
||||
@ -190,7 +191,7 @@ int ospf_area_range_set(struct ospf *ospf, struct in_addr area_id,
|
||||
ospf_schedule_abr_task(ospf);
|
||||
} else {
|
||||
range = ospf_area_range_new(p);
|
||||
ospf_area_range_add(area, range);
|
||||
ospf_area_range_add(area, ranges, range);
|
||||
ospf_schedule_abr_task(ospf);
|
||||
}
|
||||
|
||||
@ -201,20 +202,19 @@ int ospf_area_range_set(struct ospf *ospf, struct in_addr area_id,
|
||||
range->cost_config = OSPF_AREA_RANGE_COST_UNSPEC;
|
||||
}
|
||||
|
||||
if (nssa)
|
||||
SET_FLAG(range->flags, OSPF_AREA_RANGE_NSSA);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ospf_area_range_cost_set(struct ospf *ospf, struct in_addr area_id,
|
||||
struct prefix_ipv4 *p, uint32_t cost)
|
||||
int ospf_area_range_cost_set(struct ospf *ospf, struct ospf_area *area,
|
||||
struct route_table *ranges, struct prefix_ipv4 *p,
|
||||
uint32_t cost)
|
||||
{
|
||||
struct ospf_area *area;
|
||||
struct ospf_area_range *range;
|
||||
|
||||
area = ospf_area_get(ospf, area_id);
|
||||
if (area == NULL)
|
||||
return 0;
|
||||
|
||||
range = ospf_area_range_lookup(area, p);
|
||||
range = ospf_area_range_lookup(area, ranges, p);
|
||||
if (range == NULL)
|
||||
return 0;
|
||||
|
||||
@ -227,17 +227,12 @@ int ospf_area_range_cost_set(struct ospf *ospf, struct in_addr area_id,
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ospf_area_range_unset(struct ospf *ospf, struct in_addr area_id,
|
||||
struct prefix_ipv4 *p)
|
||||
int ospf_area_range_unset(struct ospf *ospf, struct ospf_area *area,
|
||||
struct route_table *ranges, struct prefix_ipv4 *p)
|
||||
{
|
||||
struct ospf_area *area;
|
||||
struct route_node *rn;
|
||||
|
||||
area = ospf_area_lookup_by_area_id(ospf, area_id);
|
||||
if (area == NULL)
|
||||
return 0;
|
||||
|
||||
rn = route_node_lookup(area->ranges, (struct prefix *)p);
|
||||
rn = route_node_lookup(ranges, (struct prefix *)p);
|
||||
if (rn == NULL)
|
||||
return 0;
|
||||
|
||||
@ -249,14 +244,12 @@ int ospf_area_range_unset(struct ospf *ospf, struct in_addr area_id,
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ospf_area_range_substitute_set(struct ospf *ospf, struct in_addr area_id,
|
||||
int ospf_area_range_substitute_set(struct ospf *ospf, struct ospf_area *area,
|
||||
struct prefix_ipv4 *p, struct prefix_ipv4 *s)
|
||||
{
|
||||
struct ospf_area *area;
|
||||
struct ospf_area_range *range;
|
||||
|
||||
area = ospf_area_get(ospf, area_id);
|
||||
range = ospf_area_range_lookup(area, p);
|
||||
range = ospf_area_range_lookup(area, area->ranges, p);
|
||||
|
||||
if (range != NULL) {
|
||||
if (!CHECK_FLAG(range->flags, OSPF_AREA_RANGE_ADVERTISE)
|
||||
@ -264,7 +257,7 @@ int ospf_area_range_substitute_set(struct ospf *ospf, struct in_addr area_id,
|
||||
ospf_schedule_abr_task(ospf);
|
||||
} else {
|
||||
range = ospf_area_range_new(p);
|
||||
ospf_area_range_add(area, range);
|
||||
ospf_area_range_add(area, area->ranges, range);
|
||||
ospf_schedule_abr_task(ospf);
|
||||
}
|
||||
|
||||
@ -276,17 +269,12 @@ int ospf_area_range_substitute_set(struct ospf *ospf, struct in_addr area_id,
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ospf_area_range_substitute_unset(struct ospf *ospf, struct in_addr area_id,
|
||||
int ospf_area_range_substitute_unset(struct ospf *ospf, struct ospf_area *area,
|
||||
struct prefix_ipv4 *p)
|
||||
{
|
||||
struct ospf_area *area;
|
||||
struct ospf_area_range *range;
|
||||
|
||||
area = ospf_area_lookup_by_area_id(ospf, area_id);
|
||||
if (area == NULL)
|
||||
return 0;
|
||||
|
||||
range = ospf_area_range_lookup(area, p);
|
||||
range = ospf_area_range_lookup(area, area->ranges, p);
|
||||
if (range == NULL)
|
||||
return 0;
|
||||
|
||||
@ -538,8 +526,7 @@ void ospf_check_abr_status(struct ospf *ospf)
|
||||
}
|
||||
|
||||
static void ospf_abr_update_aggregate(struct ospf_area_range *range,
|
||||
struct ospf_route * or,
|
||||
struct ospf_area *area)
|
||||
uint32_t cost, struct ospf_area *area)
|
||||
{
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug("%s: Start", __func__);
|
||||
@ -557,20 +544,18 @@ static void ospf_abr_update_aggregate(struct ospf_area_range *range,
|
||||
|
||||
range->cost = range->cost_config;
|
||||
} else {
|
||||
if (range->specifics == 0) {
|
||||
if (!ospf_area_range_active(range)) {
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug("%s: use or->cost %d", __func__,
|
||||
or->cost);
|
||||
zlog_debug("%s: use cost %d", __func__, cost);
|
||||
|
||||
range->cost = or->cost; /* 1st time get 1st cost */
|
||||
range->cost = cost; /* 1st time get 1st cost */
|
||||
}
|
||||
|
||||
if (or->cost > range->cost) {
|
||||
if (cost > range->cost) {
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug("%s: update to %d", __func__,
|
||||
or->cost);
|
||||
zlog_debug("%s: update to %d", __func__, cost);
|
||||
|
||||
range->cost = or->cost;
|
||||
range->cost = cost;
|
||||
}
|
||||
}
|
||||
|
||||
@ -605,6 +590,7 @@ static int ospf_abr_translate_nssa(struct ospf_area *area, struct ospf_lsa *lsa)
|
||||
struct ospf_lsa *old = NULL, *new = NULL;
|
||||
struct as_external_lsa *ext7;
|
||||
struct prefix_ipv4 p;
|
||||
struct ospf_area_range *range;
|
||||
|
||||
if (!CHECK_FLAG(lsa->data->options, OSPF_OPTION_NP)) {
|
||||
if (IS_DEBUG_OSPF_NSSA)
|
||||
@ -646,6 +632,18 @@ static int ospf_abr_translate_nssa(struct ospf_area *area, struct ospf_lsa *lsa)
|
||||
return 1;
|
||||
}
|
||||
|
||||
range = ospf_area_range_match(area, area->nssa_ranges, &p);
|
||||
if (range) {
|
||||
if (IS_DEBUG_OSPF_NSSA)
|
||||
zlog_debug("Suppressed by range %pI4/%u of area %pI4",
|
||||
&range->addr, range->masklen,
|
||||
&area->area_id);
|
||||
|
||||
ospf_abr_update_aggregate(range, GET_METRIC(ext7->e[0].metric),
|
||||
area);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (old && CHECK_FLAG(old->flags, OSPF_LSA_APPROVED)) {
|
||||
if (IS_DEBUG_OSPF_NSSA)
|
||||
zlog_debug(
|
||||
@ -675,17 +673,27 @@ static int ospf_abr_translate_nssa(struct ospf_area *area, struct ospf_lsa *lsa)
|
||||
}
|
||||
}
|
||||
|
||||
/* Area where Aggregate testing will be inserted, just like summary
|
||||
advertisements */
|
||||
/* ospf_abr_check_nssa_range (p_arg, lsa-> cost, lsa -> area); */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ospf_abr_translate_nssa_range(struct prefix_ipv4 *p, uint32_t cost)
|
||||
static void ospf_abr_translate_nssa_range(struct ospf *ospf,
|
||||
struct prefix_ipv4 *p, uint32_t cost)
|
||||
{
|
||||
/* The Type-7 is created from the aggregated prefix and forwarded
|
||||
for lsa installation and flooding... to be added... */
|
||||
struct external_info ei = {};
|
||||
struct ospf_lsa *lsa;
|
||||
|
||||
prefix_copy(&ei.p, p);
|
||||
ei.type = ZEBRA_ROUTE_OSPF;
|
||||
ei.route_map_set.metric = cost;
|
||||
ei.route_map_set.metric_type = -1;
|
||||
|
||||
lsa = ospf_external_info_find_lsa(ospf, p);
|
||||
if (lsa)
|
||||
lsa = ospf_external_lsa_refresh(ospf, lsa, &ei,
|
||||
LSA_REFRESH_FORCE, true);
|
||||
else
|
||||
lsa = ospf_external_lsa_originate(ospf, &ei);
|
||||
SET_FLAG(lsa->flags, OSPF_LSA_LOCAL_XLT);
|
||||
}
|
||||
|
||||
void ospf_abr_announce_network_to_area(struct prefix_ipv4 *p, uint32_t cost,
|
||||
@ -892,9 +900,11 @@ static void ospf_abr_announce_network(struct ospf *ospf, struct prefix_ipv4 *p,
|
||||
zlog_debug(
|
||||
"%s: this is intra-area route to %pFX",
|
||||
__func__, p);
|
||||
if ((range = ospf_area_range_match(or_area, p))
|
||||
&& !ospf_area_is_transit(area))
|
||||
ospf_abr_update_aggregate(range, or, area);
|
||||
if ((range = ospf_area_range_match(
|
||||
or_area, or_area->ranges, p)) &&
|
||||
!ospf_area_is_transit(area))
|
||||
ospf_abr_update_aggregate(range, or->cost,
|
||||
area);
|
||||
else
|
||||
ospf_abr_announce_network_to_area(p, or->cost,
|
||||
area);
|
||||
@ -1345,7 +1355,7 @@ static void ospf_abr_unapprove_summaries(struct ospf *ospf)
|
||||
zlog_debug("%s: Stop", __func__);
|
||||
}
|
||||
|
||||
static void ospf_abr_prepare_aggregates(struct ospf *ospf)
|
||||
static void ospf_abr_prepare_aggregates(struct ospf *ospf, bool nssa)
|
||||
{
|
||||
struct listnode *node;
|
||||
struct route_node *rn;
|
||||
@ -1356,7 +1366,14 @@ static void ospf_abr_prepare_aggregates(struct ospf *ospf)
|
||||
zlog_debug("%s: Start", __func__);
|
||||
|
||||
for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) {
|
||||
for (rn = route_top(area->ranges); rn; rn = route_next(rn))
|
||||
struct route_table *ranges;
|
||||
|
||||
if (nssa)
|
||||
ranges = area->nssa_ranges;
|
||||
else
|
||||
ranges = area->ranges;
|
||||
|
||||
for (rn = route_top(ranges); rn; rn = route_next(rn))
|
||||
if ((range = rn->info) != NULL) {
|
||||
range->cost = 0;
|
||||
range->specifics = 0;
|
||||
@ -1409,7 +1426,7 @@ static void ospf_abr_announce_aggregates(struct ospf *ospf)
|
||||
p.prefixlen = range->subst_masklen;
|
||||
}
|
||||
|
||||
if (range->specifics) {
|
||||
if (ospf_area_range_active(range)) {
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug("%s: active range",
|
||||
__func__);
|
||||
@ -1452,13 +1469,11 @@ static void ospf_abr_announce_aggregates(struct ospf *ospf)
|
||||
zlog_debug("%s: Stop", __func__);
|
||||
}
|
||||
|
||||
static void
|
||||
ospf_abr_send_nssa_aggregates(struct ospf *ospf) /* temporarily turned off */
|
||||
static void ospf_abr_send_nssa_aggregates(struct ospf *ospf)
|
||||
{
|
||||
struct listnode *node; /*, n; */
|
||||
struct ospf_area *area; /*, *ar; */
|
||||
struct listnode *node;
|
||||
struct ospf_area *area;
|
||||
struct route_node *rn;
|
||||
struct ospf_area_range *range;
|
||||
struct prefix_ipv4 p;
|
||||
|
||||
if (IS_DEBUG_OSPF_NSSA)
|
||||
@ -1472,20 +1487,13 @@ ospf_abr_send_nssa_aggregates(struct ospf *ospf) /* temporarily turned off */
|
||||
zlog_debug("%s: looking at area %pI4", __func__,
|
||||
&area->area_id);
|
||||
|
||||
for (rn = route_top(area->ranges); rn; rn = route_next(rn)) {
|
||||
if (rn->info == NULL)
|
||||
continue;
|
||||
for (rn = route_top(area->nssa_ranges); rn;
|
||||
rn = route_next(rn)) {
|
||||
struct ospf_area_range *range;
|
||||
|
||||
range = rn->info;
|
||||
|
||||
if (!CHECK_FLAG(range->flags,
|
||||
OSPF_AREA_RANGE_ADVERTISE)) {
|
||||
if (IS_DEBUG_OSPF_NSSA)
|
||||
zlog_debug(
|
||||
"%s: discarding suppress-ranges",
|
||||
__func__);
|
||||
if (!range)
|
||||
continue;
|
||||
}
|
||||
|
||||
p.family = AF_INET;
|
||||
p.prefix = range->addr;
|
||||
@ -1495,14 +1503,9 @@ ospf_abr_send_nssa_aggregates(struct ospf *ospf) /* temporarily turned off */
|
||||
zlog_debug("%s: this is range: %pFX", __func__,
|
||||
&p);
|
||||
|
||||
if (CHECK_FLAG(range->flags,
|
||||
OSPF_AREA_RANGE_SUBSTITUTE)) {
|
||||
p.family = AF_INET;
|
||||
p.prefix = range->subst_addr;
|
||||
p.prefixlen = range->subst_masklen;
|
||||
}
|
||||
|
||||
if (range->specifics) {
|
||||
if (ospf_area_range_active(range)
|
||||
&& CHECK_FLAG(range->flags,
|
||||
OSPF_AREA_RANGE_ADVERTISE)) {
|
||||
if (IS_DEBUG_OSPF_NSSA)
|
||||
zlog_debug("%s: active range",
|
||||
__func__);
|
||||
@ -1512,7 +1515,8 @@ ospf_abr_send_nssa_aggregates(struct ospf *ospf) /* temporarily turned off */
|
||||
* translate, Install (as Type-5), Approve, and
|
||||
* Flood
|
||||
*/
|
||||
ospf_abr_translate_nssa_range(&p, range->cost);
|
||||
ospf_abr_translate_nssa_range(ospf, &p,
|
||||
range->cost);
|
||||
}
|
||||
} /* all area ranges*/
|
||||
} /* all areas */
|
||||
@ -1807,6 +1811,82 @@ static void ospf_abr_announce_non_dna_routers(struct event *thread)
|
||||
OSPF_LOG_DEBUG(IS_DEBUG_OSPF_EVENT, "%s(): Stop", __func__);
|
||||
}
|
||||
|
||||
static void ospf_abr_nssa_type7_default_create(struct ospf *ospf,
|
||||
struct ospf_area *area,
|
||||
struct ospf_lsa *lsa)
|
||||
{
|
||||
struct external_info ei;
|
||||
|
||||
if (IS_DEBUG_OSPF_NSSA)
|
||||
zlog_debug(
|
||||
"Announcing Type-7 default route into NSSA area %pI4",
|
||||
&area->area_id);
|
||||
|
||||
/* Prepare the extrenal_info for aggregator */
|
||||
memset(&ei, 0, sizeof(struct external_info));
|
||||
ei.p.family = AF_INET;
|
||||
ei.p.prefixlen = 0;
|
||||
ei.tag = 0;
|
||||
ei.type = 0;
|
||||
ei.instance = ospf->instance;
|
||||
|
||||
/* Compute default route type and metric. */
|
||||
if (area->nssa_default_originate.metric_value != -1)
|
||||
ei.route_map_set.metric =
|
||||
area->nssa_default_originate.metric_value;
|
||||
else
|
||||
ei.route_map_set.metric = DEFAULT_DEFAULT_ALWAYS_METRIC;
|
||||
if (area->nssa_default_originate.metric_type != -1)
|
||||
ei.route_map_set.metric_type =
|
||||
area->nssa_default_originate.metric_type;
|
||||
else
|
||||
ei.route_map_set.metric_type = DEFAULT_METRIC_TYPE;
|
||||
|
||||
if (!lsa)
|
||||
ospf_nssa_lsa_originate(area, &ei);
|
||||
else
|
||||
ospf_nssa_lsa_refresh(area, lsa, &ei);
|
||||
}
|
||||
|
||||
static void ospf_abr_nssa_type7_default_delete(struct ospf *ospf,
|
||||
struct ospf_area *area,
|
||||
struct ospf_lsa *lsa)
|
||||
{
|
||||
if (lsa && !CHECK_FLAG(lsa->flags, OSPF_LSA_IN_MAXAGE)) {
|
||||
if (IS_DEBUG_OSPF_NSSA)
|
||||
zlog_debug(
|
||||
"Withdrawing Type-7 default route from area %pI4",
|
||||
&area->area_id);
|
||||
|
||||
ospf_ls_retransmit_delete_nbr_area(area, lsa);
|
||||
ospf_refresher_unregister_lsa(ospf, lsa);
|
||||
ospf_lsa_flush_area(lsa, area);
|
||||
}
|
||||
}
|
||||
|
||||
/* NSSA Type-7 default route. */
|
||||
void ospf_abr_nssa_type7_defaults(struct ospf *ospf)
|
||||
{
|
||||
struct ospf_area *area;
|
||||
struct listnode *node;
|
||||
|
||||
for (ALL_LIST_ELEMENTS_RO(ospf->areas, node, area)) {
|
||||
struct in_addr id = {};
|
||||
struct ospf_lsa *lsa;
|
||||
|
||||
lsa = ospf_lsdb_lookup_by_id(area->lsdb, OSPF_AS_NSSA_LSA, id,
|
||||
area->ospf->router_id);
|
||||
if (area->external_routing == OSPF_AREA_NSSA
|
||||
&& area->nssa_default_originate.enabled
|
||||
&& (IS_OSPF_ABR(ospf)
|
||||
|| (IS_OSPF_ASBR(ospf)
|
||||
&& ospf->nssa_default_import_check.status)))
|
||||
ospf_abr_nssa_type7_default_create(ospf, area, lsa);
|
||||
else
|
||||
ospf_abr_nssa_type7_default_delete(ospf, area, lsa);
|
||||
}
|
||||
}
|
||||
|
||||
static int ospf_abr_remove_unapproved_translates_apply(struct ospf *ospf,
|
||||
struct ospf_lsa *lsa)
|
||||
{
|
||||
@ -1874,29 +1954,38 @@ static void ospf_abr_remove_unapproved_summaries(struct ospf *ospf)
|
||||
zlog_debug("%s: Stop", __func__);
|
||||
}
|
||||
|
||||
static void ospf_abr_manage_discard_routes(struct ospf *ospf)
|
||||
static void ospf_abr_manage_discard_routes(struct ospf *ospf, bool nssa)
|
||||
{
|
||||
struct listnode *node, *nnode;
|
||||
struct route_node *rn;
|
||||
struct ospf_area *area;
|
||||
|
||||
for (ALL_LIST_ELEMENTS(ospf->areas, node, nnode, area)) {
|
||||
struct route_table *ranges;
|
||||
|
||||
if (nssa)
|
||||
ranges = area->nssa_ranges;
|
||||
else
|
||||
ranges = area->ranges;
|
||||
|
||||
for (rn = route_top(ranges); rn; rn = route_next(rn)) {
|
||||
struct ospf_area_range *range;
|
||||
|
||||
for (ALL_LIST_ELEMENTS(ospf->areas, node, nnode, area))
|
||||
for (rn = route_top(area->ranges); rn; rn = route_next(rn))
|
||||
if ((range = rn->info) != NULL)
|
||||
if (CHECK_FLAG(range->flags,
|
||||
OSPF_AREA_RANGE_ADVERTISE)) {
|
||||
if (range->specifics)
|
||||
range = rn->info;
|
||||
if (!range)
|
||||
continue;
|
||||
|
||||
if (ospf_area_range_active(range)
|
||||
&& CHECK_FLAG(range->flags,
|
||||
OSPF_AREA_RANGE_ADVERTISE))
|
||||
ospf_add_discard_route(
|
||||
ospf, ospf->new_table,
|
||||
area,
|
||||
(struct prefix_ipv4
|
||||
*)&rn->p);
|
||||
ospf, ospf->new_table, area,
|
||||
(struct prefix_ipv4 *)&rn->p, nssa);
|
||||
else
|
||||
ospf_delete_discard_route(
|
||||
ospf, ospf->new_table,
|
||||
(struct prefix_ipv4
|
||||
*)&rn->p);
|
||||
(struct prefix_ipv4 *)&rn->p, nssa);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1925,7 +2014,7 @@ static void ospf_abr_manage_discard_routes(struct ospf *ospf)
|
||||
For External Calculations, any NSSA areas use the Type-7 AREA-LSDB,
|
||||
any ABR-non-NSSA areas use the Type-5 GLOBAL-LSDB. */
|
||||
|
||||
static void ospf_abr_nssa_task(struct ospf *ospf) /* called only if any_nssa */
|
||||
void ospf_abr_nssa_task(struct ospf *ospf) /* called only if any_nssa */
|
||||
{
|
||||
if (ospf->gr_info.restart_in_progress)
|
||||
return;
|
||||
@ -1952,7 +2041,7 @@ static void ospf_abr_nssa_task(struct ospf *ospf) /* called only if any_nssa */
|
||||
/* RESET all Ranges in every Area, same as summaries */
|
||||
if (IS_DEBUG_OSPF_NSSA)
|
||||
zlog_debug("%s: NSSA initialize aggregates", __func__);
|
||||
ospf_abr_prepare_aggregates(ospf); /*TURNED OFF just for now */
|
||||
ospf_abr_prepare_aggregates(ospf, true);
|
||||
|
||||
/* For all NSSAs, Type-7s, translate to 5's, INSTALL/FLOOD, or
|
||||
* Aggregate as Type-7
|
||||
@ -1983,7 +2072,7 @@ static void ospf_abr_nssa_task(struct ospf *ospf) /* called only if any_nssa */
|
||||
zlog_debug("%s: remove unapproved translates", __func__);
|
||||
ospf_abr_remove_unapproved_translates(ospf);
|
||||
|
||||
ospf_abr_manage_discard_routes(ospf); /* same as normal...discard */
|
||||
ospf_abr_manage_discard_routes(ospf, true);
|
||||
|
||||
if (IS_DEBUG_OSPF_NSSA)
|
||||
zlog_debug("%s: Stop", __func__);
|
||||
@ -2012,7 +2101,7 @@ void ospf_abr_task(struct ospf *ospf)
|
||||
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug("%s: prepare aggregates", __func__);
|
||||
ospf_abr_prepare_aggregates(ospf);
|
||||
ospf_abr_prepare_aggregates(ospf, false);
|
||||
|
||||
if (IS_OSPF_ABR(ospf)) {
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
@ -2031,6 +2120,11 @@ void ospf_abr_task(struct ospf *ospf)
|
||||
zlog_debug("%s: announce stub defaults", __func__);
|
||||
ospf_abr_announce_stub_defaults(ospf);
|
||||
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug("%s: announce NSSA Type-7 defaults",
|
||||
__func__);
|
||||
ospf_abr_nssa_type7_defaults(ospf);
|
||||
|
||||
if (ospf->fr_configured) {
|
||||
OSPF_LOG_DEBUG(IS_DEBUG_OSPF_EVENT,
|
||||
"%s(): announce non-DNArouters",
|
||||
@ -2050,7 +2144,7 @@ void ospf_abr_task(struct ospf *ospf)
|
||||
zlog_debug("%s: remove unapproved summaries", __func__);
|
||||
ospf_abr_remove_unapproved_summaries(ospf);
|
||||
|
||||
ospf_abr_manage_discard_routes(ospf);
|
||||
ospf_abr_manage_discard_routes(ospf, false);
|
||||
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug("%s: Stop", __func__);
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
#define OSPF_AREA_RANGE_ADVERTISE (1 << 0)
|
||||
#define OSPF_AREA_RANGE_SUBSTITUTE (1 << 1)
|
||||
#define OSPF_AREA_RANGE_NSSA (1 << 2)
|
||||
|
||||
/* Area range. */
|
||||
struct ospf_area_range {
|
||||
@ -44,23 +45,23 @@ struct ospf_area_range {
|
||||
|
||||
/* Prototypes. */
|
||||
extern struct ospf_area_range *ospf_area_range_lookup(struct ospf_area *,
|
||||
struct route_table *,
|
||||
struct prefix_ipv4 *);
|
||||
|
||||
extern struct ospf_area_range *ospf_some_area_range_match(struct prefix_ipv4 *);
|
||||
|
||||
extern struct ospf_area_range *
|
||||
ospf_area_range_lookup_next(struct ospf_area *, struct in_addr *, int);
|
||||
|
||||
extern int ospf_area_range_set(struct ospf *, struct in_addr,
|
||||
struct prefix_ipv4 *, int);
|
||||
extern int ospf_area_range_cost_set(struct ospf *, struct in_addr,
|
||||
struct prefix_ipv4 *, uint32_t);
|
||||
extern int ospf_area_range_unset(struct ospf *, struct in_addr,
|
||||
struct prefix_ipv4 *);
|
||||
extern int ospf_area_range_substitute_set(struct ospf *, struct in_addr,
|
||||
extern int ospf_area_range_set(struct ospf *, struct ospf_area *,
|
||||
struct route_table *, struct prefix_ipv4 *, int,
|
||||
bool);
|
||||
extern int ospf_area_range_cost_set(struct ospf *, struct ospf_area *,
|
||||
struct route_table *, struct prefix_ipv4 *,
|
||||
uint32_t);
|
||||
extern int ospf_area_range_unset(struct ospf *, struct ospf_area *,
|
||||
struct route_table *, struct prefix_ipv4 *);
|
||||
extern int ospf_area_range_substitute_set(struct ospf *, struct ospf_area *,
|
||||
struct prefix_ipv4 *,
|
||||
struct prefix_ipv4 *);
|
||||
extern int ospf_area_range_substitute_unset(struct ospf *, struct in_addr,
|
||||
extern int ospf_area_range_substitute_unset(struct ospf *, struct ospf_area *,
|
||||
struct prefix_ipv4 *);
|
||||
extern struct ospf_area_range *ospf_area_range_match_any(struct ospf *,
|
||||
struct prefix_ipv4 *);
|
||||
@ -69,10 +70,12 @@ extern int ospf_act_bb_connection(struct ospf *);
|
||||
|
||||
extern void ospf_check_abr_status(struct ospf *);
|
||||
extern void ospf_abr_task(struct ospf *);
|
||||
extern void ospf_abr_nssa_task(struct ospf *ospf);
|
||||
extern void ospf_schedule_abr_task(struct ospf *);
|
||||
|
||||
extern void ospf_abr_announce_network_to_area(struct prefix_ipv4 *, uint32_t,
|
||||
struct ospf_area *);
|
||||
extern void ospf_abr_nssa_type7_defaults(struct ospf *ospf);
|
||||
extern void ospf_abr_nssa_check_status(struct ospf *ospf);
|
||||
extern void ospf_abr_generate_indication_lsa(struct ospf *ospf,
|
||||
const struct ospf_area *area);
|
||||
|
106
ospfd/ospf_lsa.c
106
ospfd/ospf_lsa.c
@ -1654,9 +1654,6 @@ struct in_addr ospf_get_nssa_ip(struct ospf_area *area)
|
||||
if (best_default.s_addr != INADDR_ANY)
|
||||
return best_default;
|
||||
|
||||
if (best_default.s_addr != INADDR_ANY)
|
||||
return best_default;
|
||||
|
||||
return fwd;
|
||||
}
|
||||
|
||||
@ -1868,8 +1865,7 @@ static struct ospf_lsa *ospf_external_lsa_new(struct ospf *ospf,
|
||||
}
|
||||
|
||||
/* As Type-7 */
|
||||
static void ospf_install_flood_nssa(struct ospf *ospf, struct ospf_lsa *lsa,
|
||||
struct external_info *ei)
|
||||
static void ospf_install_flood_nssa(struct ospf *ospf, struct ospf_lsa *lsa)
|
||||
{
|
||||
struct ospf_lsa *new;
|
||||
struct as_external_lsa *extlsa;
|
||||
@ -2253,7 +2249,7 @@ struct ospf_lsa *ospf_external_lsa_originate(struct ospf *ospf,
|
||||
/* stay away from translated LSAs! */
|
||||
!(CHECK_FLAG(new->flags, OSPF_LSA_LOCAL_XLT)))
|
||||
ospf_install_flood_nssa(
|
||||
ospf, new, ei); /* Install/Flood Type-7 to all NSSAs */
|
||||
ospf, new); /* Install/Flood Type-7 to all NSSAs */
|
||||
|
||||
/* Debug logging. */
|
||||
if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) {
|
||||
@ -2266,6 +2262,100 @@ struct ospf_lsa *ospf_external_lsa_originate(struct ospf *ospf,
|
||||
return new;
|
||||
}
|
||||
|
||||
/* Originate an NSSA-LSA, install and flood. */
|
||||
struct ospf_lsa *ospf_nssa_lsa_originate(struct ospf_area *area,
|
||||
struct external_info *ei)
|
||||
{
|
||||
struct ospf *ospf = area->ospf;
|
||||
struct ospf_lsa *new;
|
||||
|
||||
if (ospf->gr_info.restart_in_progress) {
|
||||
if (IS_DEBUG_OSPF(lsa, LSA_GENERATE))
|
||||
zlog_debug(
|
||||
"LSA[Type7]: Graceful Restart in progress, don't originate");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ospf->router_id.s_addr == INADDR_ANY) {
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug(
|
||||
"LSA[Type7:%pI4]: deferring NSSA-LSA origination, router ID is zero",
|
||||
&ei->p.prefix);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create new NSSA-LSA instance. */
|
||||
if ((new = ospf_external_lsa_new(ospf, ei, NULL)) == NULL) {
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug(
|
||||
"LSA[Type7:%pI4]: Could not originate NSSA-LSA",
|
||||
&ei->p.prefix);
|
||||
return NULL;
|
||||
}
|
||||
new->data->type = OSPF_AS_NSSA_LSA;
|
||||
new->area = area;
|
||||
|
||||
/* Install newly created LSA into Type-7 LSDB. */
|
||||
ospf_lsa_install(ospf, NULL, new);
|
||||
|
||||
/* Update LSA origination count. */
|
||||
ospf->lsa_originate_count++;
|
||||
|
||||
/* Flooding new LSA */
|
||||
ospf_flood_through_area(area, NULL, new);
|
||||
|
||||
/* Debug logging. */
|
||||
if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) {
|
||||
zlog_debug("LSA[Type%d:%pI4]: Originate NSSA-LSA %p",
|
||||
new->data->type, &new->data->id, (void *)new);
|
||||
ospf_lsa_header_dump(new->data);
|
||||
}
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
/* Refresh NSSA-LSA. */
|
||||
struct ospf_lsa *ospf_nssa_lsa_refresh(struct ospf_area *area,
|
||||
struct ospf_lsa *lsa,
|
||||
struct external_info *ei)
|
||||
{
|
||||
struct ospf *ospf = area->ospf;
|
||||
struct ospf_lsa *new;
|
||||
|
||||
/* Delete LSA from neighbor retransmit-list. */
|
||||
ospf_ls_retransmit_delete_nbr_as(ospf, lsa);
|
||||
|
||||
/* Unregister AS-external-LSA from refresh-list. */
|
||||
ospf_refresher_unregister_lsa(ospf, lsa);
|
||||
|
||||
/* Create new NSSA-LSA instance. */
|
||||
if ((new = ospf_external_lsa_new(ospf, ei, NULL)) == NULL) {
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug(
|
||||
"LSA[Type7:%pI4]: Could not originate NSSA-LSA",
|
||||
&ei->p.prefix);
|
||||
return NULL;
|
||||
}
|
||||
new->data->type = OSPF_AS_NSSA_LSA;
|
||||
new->data->ls_seqnum = lsa_seqnum_increment(lsa);
|
||||
new->area = area;
|
||||
|
||||
/* Install newly created LSA into Type-7 LSDB. */
|
||||
ospf_lsa_install(ospf, NULL, new);
|
||||
|
||||
/* Flooding new LSA */
|
||||
ospf_flood_through_area(area, NULL, new);
|
||||
|
||||
/* Debug logging. */
|
||||
if (IS_DEBUG_OSPF(lsa, LSA_GENERATE)) {
|
||||
zlog_debug("LSA[Type%d:%pI4]: NSSA-LSA refresh",
|
||||
new->data->type, &new->data->id);
|
||||
ospf_lsa_header_dump(new->data);
|
||||
}
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
static struct external_info *ospf_default_external_info(struct ospf *ospf)
|
||||
{
|
||||
int type;
|
||||
@ -2611,8 +2701,8 @@ struct ospf_lsa *ospf_external_lsa_refresh(struct ospf *ospf,
|
||||
|
||||
/* If any attached NSSA, install as Type-7, flood to all NSSA Areas */
|
||||
if (ospf->anyNSSA && !(CHECK_FLAG(new->flags, OSPF_LSA_LOCAL_XLT)))
|
||||
ospf_install_flood_nssa(ospf, new,
|
||||
ei); /* Install/Flood per new rules */
|
||||
ospf_install_flood_nssa(ospf,
|
||||
new); /* Install/Flood per new rules */
|
||||
|
||||
/* Register self-originated LSA to refresh queue.
|
||||
* Translated LSAs should not be registered, but refreshed upon
|
||||
|
@ -278,6 +278,11 @@ extern struct in_addr ospf_get_ip_from_ifp(struct ospf_interface *);
|
||||
|
||||
extern struct ospf_lsa *ospf_external_lsa_originate(struct ospf *,
|
||||
struct external_info *);
|
||||
extern struct ospf_lsa *ospf_nssa_lsa_originate(struct ospf_area *area,
|
||||
struct external_info *ei);
|
||||
extern struct ospf_lsa *ospf_nssa_lsa_refresh(struct ospf_area *area,
|
||||
struct ospf_lsa *lsa,
|
||||
struct external_info *ei);
|
||||
extern void ospf_external_lsa_rid_change(struct ospf *ospf);
|
||||
extern struct ospf_lsa *ospf_lsa_lookup(struct ospf *ospf, struct ospf_area *,
|
||||
uint32_t, struct in_addr,
|
||||
|
@ -1008,7 +1008,8 @@ void ospf_prune_unreachable_routers(struct route_table *rtrs)
|
||||
}
|
||||
|
||||
int ospf_add_discard_route(struct ospf *ospf, struct route_table *rt,
|
||||
struct ospf_area *area, struct prefix_ipv4 *p)
|
||||
struct ospf_area *area, struct prefix_ipv4 *p,
|
||||
bool nssa)
|
||||
{
|
||||
struct route_node *rn;
|
||||
struct ospf_route * or, *new_or;
|
||||
@ -1027,7 +1028,7 @@ int ospf_add_discard_route(struct ospf *ospf, struct route_table *rt,
|
||||
|
||||
or = rn->info;
|
||||
|
||||
if (or->path_type == OSPF_PATH_INTRA_AREA) {
|
||||
if (!nssa && or->path_type == OSPF_PATH_INTRA_AREA) {
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug("%s: an intra-area route exists",
|
||||
__func__);
|
||||
@ -1054,6 +1055,9 @@ int ospf_add_discard_route(struct ospf *ospf, struct route_table *rt,
|
||||
new_or->cost = 0;
|
||||
new_or->u.std.area_id = area->area_id;
|
||||
new_or->u.std.external_routing = area->external_routing;
|
||||
if (nssa)
|
||||
new_or->path_type = OSPF_PATH_TYPE2_EXTERNAL;
|
||||
else
|
||||
new_or->path_type = OSPF_PATH_INTER_AREA;
|
||||
rn->info = new_or;
|
||||
|
||||
@ -1063,7 +1067,7 @@ int ospf_add_discard_route(struct ospf *ospf, struct route_table *rt,
|
||||
}
|
||||
|
||||
void ospf_delete_discard_route(struct ospf *ospf, struct route_table *rt,
|
||||
struct prefix_ipv4 *p)
|
||||
struct prefix_ipv4 *p, bool nssa)
|
||||
{
|
||||
struct route_node *rn;
|
||||
struct ospf_route * or ;
|
||||
@ -1081,7 +1085,7 @@ void ospf_delete_discard_route(struct ospf *ospf, struct route_table *rt,
|
||||
|
||||
or = rn->info;
|
||||
|
||||
if (or->path_type == OSPF_PATH_INTRA_AREA) {
|
||||
if (!nssa && or->path_type == OSPF_PATH_INTRA_AREA) {
|
||||
if (IS_DEBUG_OSPF_EVENT)
|
||||
zlog_debug("%s: an intra-area route exists", __func__);
|
||||
return;
|
||||
|
@ -152,9 +152,10 @@ extern void ospf_route_subst_nexthops(struct ospf_route *, struct list *);
|
||||
extern void ospf_prune_unreachable_networks(struct route_table *);
|
||||
extern void ospf_prune_unreachable_routers(struct route_table *);
|
||||
extern int ospf_add_discard_route(struct ospf *, struct route_table *,
|
||||
struct ospf_area *, struct prefix_ipv4 *);
|
||||
struct ospf_area *, struct prefix_ipv4 *,
|
||||
bool);
|
||||
extern void ospf_delete_discard_route(struct ospf *, struct route_table *,
|
||||
struct prefix_ipv4 *);
|
||||
struct prefix_ipv4 *, bool);
|
||||
extern int ospf_route_match_same(struct route_table *, struct prefix_ipv4 *,
|
||||
struct ospf_route *);
|
||||
|
||||
|
@ -1112,7 +1112,7 @@ static struct ospf_area_range *ospfAreaRangeLookup(struct variable *v,
|
||||
oid2in_addr(offset, IN_ADDR_SIZE, range_net);
|
||||
p.prefix = *range_net;
|
||||
|
||||
return ospf_area_range_lookup(area, &p);
|
||||
return ospf_area_range_lookup(area, area->ranges, &p);
|
||||
} else {
|
||||
/* Set OID offset for Area ID. */
|
||||
offset = name + v->namelen;
|
||||
|
405
ospfd/ospf_vty.c
405
ospfd/ospf_vty.c
@ -611,6 +611,7 @@ DEFUN (ospf_area_range,
|
||||
"Advertised metric for this range\n")
|
||||
{
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
struct ospf_area *area;
|
||||
int idx_ipv4_number = 1;
|
||||
int idx_ipv4_prefixlen = 3;
|
||||
int idx_cost = 6;
|
||||
@ -622,12 +623,14 @@ DEFUN (ospf_area_range,
|
||||
VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
|
||||
str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
|
||||
|
||||
ospf_area_range_set(ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
|
||||
ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
|
||||
format);
|
||||
area = ospf_area_get(ospf, area_id);
|
||||
ospf_area_display_format_set(ospf, area, format);
|
||||
|
||||
ospf_area_range_set(ospf, area, area->ranges, &p,
|
||||
OSPF_AREA_RANGE_ADVERTISE, false);
|
||||
if (argc > 5) {
|
||||
cost = strtoul(argv[idx_cost]->arg, NULL, 10);
|
||||
ospf_area_range_cost_set(ospf, area_id, &p, cost);
|
||||
ospf_area_range_cost_set(ospf, area, area->ranges, &p, cost);
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
@ -647,6 +650,7 @@ DEFUN (ospf_area_range_cost,
|
||||
"Network prefix to be announced instead of range\n")
|
||||
{
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
struct ospf_area *area;
|
||||
int idx_ipv4_number = 1;
|
||||
int idx_ipv4_prefixlen = 3;
|
||||
int idx = 4;
|
||||
@ -658,19 +662,20 @@ DEFUN (ospf_area_range_cost,
|
||||
VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
|
||||
str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
|
||||
|
||||
ospf_area_range_set(ospf, area_id, &p, OSPF_AREA_RANGE_ADVERTISE);
|
||||
ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
|
||||
format);
|
||||
area = ospf_area_get(ospf, area_id);
|
||||
ospf_area_display_format_set(ospf, area, format);
|
||||
|
||||
ospf_area_range_set(ospf, area, area->ranges, &p,
|
||||
OSPF_AREA_RANGE_ADVERTISE, false);
|
||||
if (argv_find(argv, argc, "cost", &idx)) {
|
||||
cost = strtoul(argv[idx + 1]->arg, NULL, 10);
|
||||
ospf_area_range_cost_set(ospf, area_id, &p, cost);
|
||||
ospf_area_range_cost_set(ospf, area, area->ranges, &p, cost);
|
||||
}
|
||||
|
||||
idx = 4;
|
||||
if (argv_find(argv, argc, "substitute", &idx)) {
|
||||
str2prefix_ipv4(argv[idx + 1]->arg, &s);
|
||||
ospf_area_range_substitute_set(ospf, area_id, &p, &s);
|
||||
ospf_area_range_substitute_set(ospf, area, &p, &s);
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
@ -687,6 +692,7 @@ DEFUN (ospf_area_range_not_advertise,
|
||||
"DoNotAdvertise this range\n")
|
||||
{
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
struct ospf_area *area;
|
||||
int idx_ipv4_number = 1;
|
||||
int idx_ipv4_prefixlen = 3;
|
||||
struct prefix_ipv4 p;
|
||||
@ -696,10 +702,11 @@ DEFUN (ospf_area_range_not_advertise,
|
||||
VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
|
||||
str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
|
||||
|
||||
ospf_area_range_set(ospf, area_id, &p, 0);
|
||||
ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
|
||||
format);
|
||||
ospf_area_range_substitute_unset(ospf, area_id, &p);
|
||||
area = ospf_area_get(ospf, area_id);
|
||||
ospf_area_display_format_set(ospf, area, format);
|
||||
|
||||
ospf_area_range_set(ospf, area, area->ranges, &p, 0, false);
|
||||
ospf_area_range_substitute_unset(ospf, area, &p);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
@ -721,6 +728,7 @@ DEFUN (no_ospf_area_range,
|
||||
"DoNotAdvertise this range\n")
|
||||
{
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
struct ospf_area *area;
|
||||
int idx_ipv4_number = 2;
|
||||
int idx_ipv4_prefixlen = 4;
|
||||
struct prefix_ipv4 p;
|
||||
@ -730,7 +738,10 @@ DEFUN (no_ospf_area_range,
|
||||
VTY_GET_OSPF_AREA_ID(area_id, format, argv[idx_ipv4_number]->arg);
|
||||
str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
|
||||
|
||||
ospf_area_range_unset(ospf, area_id, &p);
|
||||
area = ospf_area_get(ospf, area_id);
|
||||
ospf_area_display_format_set(ospf, area, format);
|
||||
|
||||
ospf_area_range_unset(ospf, area, area->ranges, &p);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
@ -748,6 +759,7 @@ DEFUN (no_ospf_area_range_substitute,
|
||||
"Network prefix to be announced instead of range\n")
|
||||
{
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
struct ospf_area *area;
|
||||
int idx_ipv4_number = 2;
|
||||
int idx_ipv4_prefixlen = 4;
|
||||
int idx_ipv4_prefixlen_2 = 6;
|
||||
@ -759,7 +771,10 @@ DEFUN (no_ospf_area_range_substitute,
|
||||
str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
|
||||
str2prefix_ipv4(argv[idx_ipv4_prefixlen_2]->arg, &s);
|
||||
|
||||
ospf_area_range_substitute_unset(ospf, area_id, &p);
|
||||
area = ospf_area_get(ospf, area_id);
|
||||
ospf_area_display_format_set(ospf, area, format);
|
||||
|
||||
ospf_area_range_substitute_unset(ospf, area, &p);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
@ -1433,15 +1448,35 @@ DEFUN (no_ospf_area_stub_no_summary,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
static int ospf_area_nssa_cmd_handler(struct vty *vty, int argc,
|
||||
struct cmd_token **argv, int cfg_nosum,
|
||||
int nosum)
|
||||
DEFPY (ospf_area_nssa,
|
||||
ospf_area_nssa_cmd,
|
||||
"area <A.B.C.D|(0-4294967295)>$area_str nssa\
|
||||
[{\
|
||||
<translate-candidate|translate-never|translate-always>$translator_role\
|
||||
|default-information-originate$dflt_originate [{metric (0-16777214)$mval|metric-type (1-2)$mtype}]\
|
||||
|no-summary$no_summary\
|
||||
|suppress-fa$suppress_fa\
|
||||
}]",
|
||||
"OSPF area parameters\n"
|
||||
"OSPF area ID in IP address format\n"
|
||||
"OSPF area ID as a decimal value\n"
|
||||
"Configure OSPF area as nssa\n"
|
||||
"Configure NSSA-ABR for translate election (default)\n"
|
||||
"Configure NSSA-ABR to never translate\n"
|
||||
"Configure NSSA-ABR to always translate\n"
|
||||
"Originate Type 7 default into NSSA area\n"
|
||||
"OSPF default metric\n"
|
||||
"OSPF metric\n"
|
||||
"OSPF metric type for default routes\n"
|
||||
"Set OSPF External Type 1/2 metrics\n"
|
||||
"Do not inject inter-area routes into nssa\n"
|
||||
"Suppress forwarding address\n")
|
||||
{
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
struct in_addr area_id;
|
||||
int ret, format;
|
||||
|
||||
VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id, format, argv[1]->arg);
|
||||
VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id, format, area_str);
|
||||
|
||||
ret = ospf_area_nssa_set(ospf, area_id);
|
||||
ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
|
||||
@ -1452,14 +1487,14 @@ static int ospf_area_nssa_cmd_handler(struct vty *vty, int argc,
|
||||
return CMD_WARNING_CONFIG_FAILED;
|
||||
}
|
||||
|
||||
if (argc > 3) {
|
||||
if (strncmp(argv[3]->text, "translate-c", 11) == 0)
|
||||
if (translator_role) {
|
||||
if (strncmp(translator_role, "translate-c", 11) == 0)
|
||||
ospf_area_nssa_translator_role_set(
|
||||
ospf, area_id, OSPF_NSSA_ROLE_CANDIDATE);
|
||||
else if (strncmp(argv[3]->text, "translate-n", 11) == 0)
|
||||
else if (strncmp(translator_role, "translate-n", 11) == 0)
|
||||
ospf_area_nssa_translator_role_set(
|
||||
ospf, area_id, OSPF_NSSA_ROLE_NEVER);
|
||||
else if (strncmp(argv[3]->text, "translate-a", 11) == 0)
|
||||
else if (strncmp(translator_role, "translate-a", 11) == 0)
|
||||
ospf_area_nssa_translator_role_set(
|
||||
ospf, area_id, OSPF_NSSA_ROLE_ALWAYS);
|
||||
} else {
|
||||
@ -1467,12 +1502,27 @@ static int ospf_area_nssa_cmd_handler(struct vty *vty, int argc,
|
||||
OSPF_NSSA_ROLE_CANDIDATE);
|
||||
}
|
||||
|
||||
if (cfg_nosum) {
|
||||
if (nosum)
|
||||
ospf_area_no_summary_set(ospf, area_id);
|
||||
if (dflt_originate) {
|
||||
int metric_type = DEFAULT_METRIC_TYPE;
|
||||
|
||||
if (mval_str == NULL)
|
||||
mval = -1;
|
||||
if (mtype_str)
|
||||
(void)str2metric_type(mtype_str, &metric_type);
|
||||
ospf_area_nssa_default_originate_set(ospf, area_id, mval,
|
||||
metric_type);
|
||||
} else
|
||||
ospf_area_nssa_default_originate_unset(ospf, area_id);
|
||||
|
||||
if (no_summary)
|
||||
ospf_area_nssa_no_summary_set(ospf, area_id);
|
||||
else
|
||||
ospf_area_no_summary_unset(ospf, area_id);
|
||||
}
|
||||
|
||||
if (suppress_fa)
|
||||
ospf_area_nssa_suppress_fa_set(ospf, area_id);
|
||||
else
|
||||
ospf_area_nssa_suppress_fa_unset(ospf, area_id);
|
||||
|
||||
/* Flush the external LSA for the specified area */
|
||||
ospf_flush_lsa_from_area(ospf, area_id, OSPF_AS_EXTERNAL_LSA);
|
||||
@ -1482,141 +1532,15 @@ static int ospf_area_nssa_cmd_handler(struct vty *vty, int argc,
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
DEFUN (ospf_area_nssa_translate,
|
||||
ospf_area_nssa_translate_cmd,
|
||||
"area <A.B.C.D|(0-4294967295)> nssa <translate-candidate|translate-never|translate-always>",
|
||||
"OSPF area parameters\n"
|
||||
"OSPF area ID in IP address format\n"
|
||||
"OSPF area ID as a decimal value\n"
|
||||
"Configure OSPF area as nssa\n"
|
||||
"Configure NSSA-ABR for translate election (default)\n"
|
||||
"Configure NSSA-ABR to never translate\n"
|
||||
"Configure NSSA-ABR to always translate\n")
|
||||
{
|
||||
return ospf_area_nssa_cmd_handler(vty, argc, argv, 0, 0);
|
||||
}
|
||||
|
||||
DEFUN (ospf_area_nssa,
|
||||
ospf_area_nssa_cmd,
|
||||
"area <A.B.C.D|(0-4294967295)> nssa",
|
||||
"OSPF area parameters\n"
|
||||
"OSPF area ID in IP address format\n"
|
||||
"OSPF area ID as a decimal value\n"
|
||||
"Configure OSPF area as nssa\n")
|
||||
{
|
||||
return ospf_area_nssa_cmd_handler(vty, argc, argv, 0, 0);
|
||||
}
|
||||
|
||||
DEFUN(ospf_area_nssa_suppress_fa, ospf_area_nssa_suppress_fa_cmd,
|
||||
"area <A.B.C.D|(0-4294967295)> nssa suppress-fa",
|
||||
"OSPF area parameters\n"
|
||||
"OSPF area ID in IP address format\n"
|
||||
"OSPF area ID as a decimal value\n"
|
||||
"Configure OSPF area as nssa\n"
|
||||
"Suppress forwarding address\n")
|
||||
{
|
||||
int idx_ipv4_number = 1;
|
||||
struct in_addr area_id;
|
||||
int format;
|
||||
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id, format,
|
||||
argv[idx_ipv4_number]->arg);
|
||||
|
||||
ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
|
||||
format);
|
||||
ospf_area_nssa_suppress_fa_set(ospf, area_id);
|
||||
|
||||
ospf_schedule_abr_task(ospf);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN(no_ospf_area_nssa_suppress_fa, no_ospf_area_nssa_suppress_fa_cmd,
|
||||
"no area <A.B.C.D|(0-4294967295)> nssa suppress-fa",
|
||||
NO_STR
|
||||
"OSPF area parameters\n"
|
||||
"OSPF area ID in IP address format\n"
|
||||
"OSPF area ID as a decimal value\n"
|
||||
"Configure OSPF area as nssa\n"
|
||||
"Suppress forwarding address\n")
|
||||
{
|
||||
int idx_ipv4_number = 2;
|
||||
struct in_addr area_id;
|
||||
int format;
|
||||
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
|
||||
VTY_GET_OSPF_AREA_ID_NO_BB("nssa", area_id, format,
|
||||
argv[idx_ipv4_number]->arg);
|
||||
|
||||
ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
|
||||
format);
|
||||
ospf_area_nssa_suppress_fa_unset(ospf, area_id);
|
||||
|
||||
ospf_schedule_abr_task(ospf);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (ospf_area_nssa_no_summary,
|
||||
ospf_area_nssa_no_summary_cmd,
|
||||
"area <A.B.C.D|(0-4294967295)> nssa no-summary",
|
||||
"OSPF area parameters\n"
|
||||
"OSPF area ID in IP address format\n"
|
||||
"OSPF area ID as a decimal value\n"
|
||||
"Configure OSPF area as nssa\n"
|
||||
"Do not inject inter-area routes into nssa\n")
|
||||
{
|
||||
int idx_ipv4_number = 1;
|
||||
struct in_addr area_id;
|
||||
int format;
|
||||
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id, format,
|
||||
argv[idx_ipv4_number]->arg);
|
||||
|
||||
ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
|
||||
format);
|
||||
ospf_area_nssa_no_summary_set(ospf, area_id);
|
||||
|
||||
ospf_schedule_abr_task(ospf);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_ospf_area_nssa_no_summary,
|
||||
no_ospf_area_nssa_no_summary_cmd,
|
||||
"no area <A.B.C.D|(0-4294967295)> nssa no-summary",
|
||||
NO_STR
|
||||
"OSPF area parameters\n"
|
||||
"OSPF area ID in IP address format\n"
|
||||
"OSPF area ID as a decimal value\n"
|
||||
"Configure OSPF area as nssa\n"
|
||||
"Do not inject inter-area routes into nssa\n")
|
||||
{
|
||||
int idx_ipv4_number = 2;
|
||||
struct in_addr area_id;
|
||||
int format;
|
||||
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
|
||||
VTY_GET_OSPF_AREA_ID_NO_BB("nssa", area_id, format,
|
||||
argv[idx_ipv4_number]->arg);
|
||||
|
||||
ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
|
||||
format);
|
||||
ospf_area_no_summary_unset(ospf, area_id);
|
||||
|
||||
ospf_schedule_abr_task(ospf);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_ospf_area_nssa,
|
||||
DEFPY (no_ospf_area_nssa,
|
||||
no_ospf_area_nssa_cmd,
|
||||
"no area <A.B.C.D|(0-4294967295)> nssa [<translate-candidate|translate-never|translate-always>]",
|
||||
"no area <A.B.C.D|(0-4294967295)>$area_str nssa\
|
||||
[{\
|
||||
<translate-candidate|translate-never|translate-always>\
|
||||
|default-information-originate [{metric (0-16777214)|metric-type (1-2)}]\
|
||||
|no-summary\
|
||||
|suppress-fa\
|
||||
}]",
|
||||
NO_STR
|
||||
"OSPF area parameters\n"
|
||||
"OSPF area ID in IP address format\n"
|
||||
@ -1624,25 +1548,108 @@ DEFUN (no_ospf_area_nssa,
|
||||
"Configure OSPF area as nssa\n"
|
||||
"Configure NSSA-ABR for translate election (default)\n"
|
||||
"Configure NSSA-ABR to never translate\n"
|
||||
"Configure NSSA-ABR to always translate\n")
|
||||
"Configure NSSA-ABR to always translate\n"
|
||||
"Originate Type 7 default into NSSA area\n"
|
||||
"OSPF default metric\n"
|
||||
"OSPF metric\n"
|
||||
"OSPF metric type for default routes\n"
|
||||
"Set OSPF External Type 1/2 metrics\n"
|
||||
"Do not inject inter-area routes into nssa\n"
|
||||
"Suppress forwarding address\n")
|
||||
{
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
int idx_ipv4_number = 2;
|
||||
struct in_addr area_id;
|
||||
int format;
|
||||
|
||||
VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id, format,
|
||||
argv[idx_ipv4_number]->arg);
|
||||
VTY_GET_OSPF_AREA_ID_NO_BB("NSSA", area_id, format, area_str);
|
||||
|
||||
/* Flush the NSSA LSA for the specified area */
|
||||
ospf_flush_lsa_from_area(ospf, area_id, OSPF_AS_NSSA_LSA);
|
||||
ospf_area_nssa_unset(ospf, area_id, argc);
|
||||
ospf_area_no_summary_unset(ospf, area_id);
|
||||
ospf_area_nssa_default_originate_unset(ospf, area_id);
|
||||
ospf_area_nssa_suppress_fa_unset(ospf, area_id);
|
||||
ospf_area_nssa_unset(ospf, area_id);
|
||||
|
||||
ospf_schedule_abr_task(ospf);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFPY (ospf_area_nssa_range,
|
||||
ospf_area_nssa_range_cmd,
|
||||
"area <A.B.C.D|(0-4294967295)>$area_str nssa range A.B.C.D/M$prefix [<not-advertise$not_adv|cost (0-16777215)$cost>]",
|
||||
"OSPF area parameters\n"
|
||||
"OSPF area ID in IP address format\n"
|
||||
"OSPF area ID as a decimal value\n"
|
||||
"Configure OSPF area as nssa\n"
|
||||
"Configured address range\n"
|
||||
"Specify IPv4 prefix\n"
|
||||
"Do not advertise\n"
|
||||
"User specified metric for this range\n"
|
||||
"Advertised metric for this range\n")
|
||||
{
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
struct ospf_area *area;
|
||||
struct in_addr area_id;
|
||||
int format;
|
||||
int advertise = 0;
|
||||
|
||||
VTY_GET_OSPF_AREA_ID(area_id, format, area_str);
|
||||
area = ospf_area_get(ospf, area_id);
|
||||
ospf_area_display_format_set(ospf, area, format);
|
||||
|
||||
if (area->external_routing != OSPF_AREA_NSSA) {
|
||||
vty_out(vty, "%% First configure %s as an NSSA area\n",
|
||||
area_str);
|
||||
return CMD_WARNING;
|
||||
}
|
||||
|
||||
if (!not_adv)
|
||||
advertise = OSPF_AREA_RANGE_ADVERTISE;
|
||||
|
||||
ospf_area_range_set(ospf, area, area->nssa_ranges,
|
||||
(struct prefix_ipv4 *)prefix, advertise, true);
|
||||
if (cost_str)
|
||||
ospf_area_range_cost_set(ospf, area, area->nssa_ranges,
|
||||
(struct prefix_ipv4 *)prefix, cost);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFPY (no_ospf_area_nssa_range,
|
||||
no_ospf_area_nssa_range_cmd,
|
||||
"no area <A.B.C.D|(0-4294967295)>$area_str nssa range A.B.C.D/M$prefix [<not-advertise|cost (0-16777215)>]",
|
||||
NO_STR
|
||||
"OSPF area parameters\n"
|
||||
"OSPF area ID in IP address format\n"
|
||||
"OSPF area ID as a decimal value\n"
|
||||
"Configure OSPF area as nssa\n"
|
||||
"Configured address range\n"
|
||||
"Specify IPv4 prefix\n"
|
||||
"Do not advertise\n"
|
||||
"User specified metric for this range\n"
|
||||
"Advertised metric for this range\n")
|
||||
{
|
||||
VTY_DECLVAR_INSTANCE_CONTEXT(ospf, ospf);
|
||||
struct ospf_area *area;
|
||||
struct in_addr area_id;
|
||||
int format;
|
||||
|
||||
VTY_GET_OSPF_AREA_ID(area_id, format, area_str);
|
||||
area = ospf_area_get(ospf, area_id);
|
||||
ospf_area_display_format_set(ospf, area, format);
|
||||
|
||||
if (area->external_routing != OSPF_AREA_NSSA) {
|
||||
vty_out(vty, "%% First configure %s as an NSSA area\n",
|
||||
area_str);
|
||||
return CMD_WARNING;
|
||||
}
|
||||
|
||||
ospf_area_range_unset(ospf, area, area->nssa_ranges,
|
||||
(struct prefix_ipv4 *)prefix);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (ospf_area_default_cost,
|
||||
ospf_area_default_cost_cmd,
|
||||
@ -11981,29 +11988,62 @@ static int config_write_ospf_area(struct vty *vty, struct ospf *ospf)
|
||||
vty_out(vty, " no-summary\n");
|
||||
vty_out(vty, "\n");
|
||||
} else if (area->external_routing == OSPF_AREA_NSSA) {
|
||||
vty_out(vty, " area %s nssa", buf);
|
||||
|
||||
switch (area->NSSATranslatorRole) {
|
||||
case OSPF_NSSA_ROLE_NEVER:
|
||||
vty_out(vty,
|
||||
" area %s nssa translate-never\n",
|
||||
buf);
|
||||
vty_out(vty, " translate-never");
|
||||
break;
|
||||
case OSPF_NSSA_ROLE_ALWAYS:
|
||||
vty_out(vty,
|
||||
" area %s nssa translate-always\n",
|
||||
buf);
|
||||
vty_out(vty, " translate-always");
|
||||
break;
|
||||
case OSPF_NSSA_ROLE_CANDIDATE:
|
||||
vty_out(vty, " area %s nssa \n", buf);
|
||||
break;
|
||||
}
|
||||
|
||||
if (area->nssa_default_originate.enabled) {
|
||||
vty_out(vty,
|
||||
" default-information-originate");
|
||||
if (area->nssa_default_originate
|
||||
.metric_value != -1)
|
||||
vty_out(vty, " metric %d",
|
||||
area->nssa_default_originate
|
||||
.metric_value);
|
||||
if (area->nssa_default_originate
|
||||
.metric_type !=
|
||||
DEFAULT_METRIC_TYPE)
|
||||
vty_out(vty, " metric-type 1");
|
||||
}
|
||||
|
||||
if (area->no_summary)
|
||||
vty_out(vty,
|
||||
" area %s nssa no-summary\n",
|
||||
buf);
|
||||
vty_out(vty, " no-summary");
|
||||
if (area->suppress_fa)
|
||||
vty_out(vty,
|
||||
" area %s nssa suppress-fa\n",
|
||||
buf);
|
||||
vty_out(vty, " suppress-fa");
|
||||
vty_out(vty, "\n");
|
||||
|
||||
for (rn1 = route_top(area->nssa_ranges); rn1;
|
||||
rn1 = route_next(rn1)) {
|
||||
struct ospf_area_range *range;
|
||||
|
||||
range = rn1->info;
|
||||
if (!range)
|
||||
continue;
|
||||
|
||||
vty_out(vty, " area %s nssa range %pFX",
|
||||
buf, &rn1->p);
|
||||
|
||||
if (range->cost_config !=
|
||||
OSPF_AREA_RANGE_COST_UNSPEC)
|
||||
vty_out(vty, " cost %u",
|
||||
range->cost_config);
|
||||
|
||||
if (!CHECK_FLAG(
|
||||
range->flags,
|
||||
OSPF_AREA_RANGE_ADVERTISE))
|
||||
vty_out(vty, " not-advertise");
|
||||
|
||||
vty_out(vty, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (area->default_cost != 1)
|
||||
@ -13029,12 +13069,9 @@ void ospf_vty_init(void)
|
||||
|
||||
/* "area nssa" commands. */
|
||||
install_element(OSPF_NODE, &ospf_area_nssa_cmd);
|
||||
install_element(OSPF_NODE, &ospf_area_nssa_translate_cmd);
|
||||
install_element(OSPF_NODE, &ospf_area_nssa_no_summary_cmd);
|
||||
install_element(OSPF_NODE, &no_ospf_area_nssa_no_summary_cmd);
|
||||
install_element(OSPF_NODE, &ospf_area_nssa_suppress_fa_cmd);
|
||||
install_element(OSPF_NODE, &no_ospf_area_nssa_suppress_fa_cmd);
|
||||
install_element(OSPF_NODE, &no_ospf_area_nssa_cmd);
|
||||
install_element(OSPF_NODE, &ospf_area_nssa_range_cmd);
|
||||
install_element(OSPF_NODE, &no_ospf_area_nssa_range_cmd);
|
||||
|
||||
install_element(OSPF_NODE, &ospf_area_default_cost_cmd);
|
||||
install_element(OSPF_NODE, &no_ospf_area_default_cost_cmd);
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "log.h"
|
||||
#include "route_opaque.h"
|
||||
#include "lib/bfd.h"
|
||||
#include "lib/lib_errors.h"
|
||||
#include "nexthop.h"
|
||||
|
||||
#include "ospfd/ospfd.h"
|
||||
@ -1470,6 +1471,61 @@ static int ospf_zebra_read_route(ZAPI_CALLBACK_ARGS)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ospf_zebra_import_default_route(struct ospf *ospf, bool unreg)
|
||||
{
|
||||
struct prefix prefix = {};
|
||||
int command;
|
||||
|
||||
if (zclient->sock < 0) {
|
||||
if (IS_DEBUG_OSPF(zebra, ZEBRA))
|
||||
zlog_debug(" Not connected to Zebra");
|
||||
return;
|
||||
}
|
||||
|
||||
prefix.family = AF_INET;
|
||||
prefix.prefixlen = 0;
|
||||
|
||||
if (unreg)
|
||||
command = ZEBRA_NEXTHOP_UNREGISTER;
|
||||
else
|
||||
command = ZEBRA_NEXTHOP_REGISTER;
|
||||
|
||||
if (IS_DEBUG_OSPF(zebra, ZEBRA))
|
||||
zlog_debug("%s: sending cmd %s for %pFX (vrf %u)", __func__,
|
||||
zserv_command_string(command), &prefix,
|
||||
ospf->vrf_id);
|
||||
|
||||
if (zclient_send_rnh(zclient, command, &prefix, SAFI_UNICAST, false,
|
||||
true, ospf->vrf_id) == ZCLIENT_SEND_FAILURE)
|
||||
flog_err(EC_LIB_ZAPI_SOCKET, "%s: zclient_send_rnh() failed",
|
||||
__func__);
|
||||
}
|
||||
|
||||
static int ospf_zebra_import_check_update(ZAPI_CALLBACK_ARGS)
|
||||
{
|
||||
struct ospf *ospf;
|
||||
struct zapi_route nhr;
|
||||
struct prefix matched;
|
||||
|
||||
ospf = ospf_lookup_by_vrf_id(vrf_id);
|
||||
if (ospf == NULL || !IS_OSPF_ASBR(ospf))
|
||||
return 0;
|
||||
|
||||
if (!zapi_nexthop_update_decode(zclient->ibuf, &matched, &nhr)) {
|
||||
zlog_err("%s[%u]: Failure to decode route", __func__,
|
||||
ospf->vrf_id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (matched.family != AF_INET || matched.prefixlen != 0 ||
|
||||
nhr.type == ZEBRA_ROUTE_OSPF)
|
||||
return 0;
|
||||
|
||||
ospf->nssa_default_import_check.status = !!nhr.nexthop_num;
|
||||
ospf_abr_nssa_type7_defaults(ospf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ospf_distribute_list_out_set(struct ospf *ospf, int type, const char *name)
|
||||
{
|
||||
@ -2132,6 +2188,7 @@ static zclient_handler *const ospf_handlers[] = {
|
||||
|
||||
[ZEBRA_REDISTRIBUTE_ROUTE_ADD] = ospf_zebra_read_route,
|
||||
[ZEBRA_REDISTRIBUTE_ROUTE_DEL] = ospf_zebra_read_route,
|
||||
[ZEBRA_NEXTHOP_UPDATE] = ospf_zebra_import_check_update,
|
||||
|
||||
[ZEBRA_OPAQUE_MESSAGE] = ospf_opaque_msg_handler,
|
||||
|
||||
|
@ -69,6 +69,7 @@ extern int ospf_redistribute_set(struct ospf *, struct ospf_redist *, int,
|
||||
unsigned short, int, int);
|
||||
extern int ospf_redistribute_unset(struct ospf *, int, unsigned short);
|
||||
extern int ospf_redistribute_default_set(struct ospf *, int, int, int);
|
||||
extern void ospf_zebra_import_default_route(struct ospf *ospf, bool unreg);
|
||||
extern int ospf_distribute_list_out_set(struct ospf *, int, const char *);
|
||||
extern int ospf_distribute_list_out_unset(struct ospf *, int, const char *);
|
||||
extern void ospf_routemap_set(struct ospf_redist *, const char *);
|
||||
|
@ -963,6 +963,7 @@ struct ospf_area *ospf_area_new(struct ospf *ospf, struct in_addr area_id)
|
||||
|
||||
new->oiflist = list_new();
|
||||
new->ranges = route_table_init();
|
||||
new->nssa_ranges = route_table_init();
|
||||
|
||||
if (area_id.s_addr == OSPF_AREA_BACKBONE)
|
||||
ospf->backbone = new;
|
||||
@ -1006,6 +1007,7 @@ static void ospf_area_free(struct ospf_area *area)
|
||||
ospf_lsa_unlock(&area->router_lsa_self);
|
||||
|
||||
route_table_finish(area->ranges);
|
||||
route_table_finish(area->nssa_ranges);
|
||||
list_delete(&area->oiflist);
|
||||
|
||||
if (EXPORT_NAME(area))
|
||||
@ -1029,13 +1031,14 @@ void ospf_area_check_free(struct ospf *ospf, struct in_addr area_id)
|
||||
struct ospf_area *area;
|
||||
|
||||
area = ospf_area_lookup_by_area_id(ospf, area_id);
|
||||
if (area && listcount(area->oiflist) == 0 && area->ranges->top == NULL
|
||||
&& !ospf_vl_count(ospf, area)
|
||||
&& area->shortcut_configured == OSPF_SHORTCUT_DEFAULT
|
||||
&& area->external_routing == OSPF_AREA_DEFAULT
|
||||
&& area->no_summary == 0 && area->default_cost == 1
|
||||
&& EXPORT_NAME(area) == NULL && IMPORT_NAME(area) == NULL
|
||||
&& area->auth_type == OSPF_AUTH_NULL) {
|
||||
if (area && listcount(area->oiflist) == 0 &&
|
||||
area->ranges->top == NULL && area->nssa_ranges->top == NULL &&
|
||||
!ospf_vl_count(ospf, area) &&
|
||||
area->shortcut_configured == OSPF_SHORTCUT_DEFAULT &&
|
||||
area->external_routing == OSPF_AREA_DEFAULT &&
|
||||
area->no_summary == 0 && area->default_cost == 1 &&
|
||||
EXPORT_NAME(area) == NULL && IMPORT_NAME(area) == NULL &&
|
||||
area->auth_type == OSPF_AUTH_NULL) {
|
||||
listnode_delete(ospf->areas, area);
|
||||
ospf_area_free(area);
|
||||
}
|
||||
@ -1701,7 +1704,7 @@ int ospf_area_nssa_set(struct ospf *ospf, struct in_addr area_id)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ospf_area_nssa_unset(struct ospf *ospf, struct in_addr area_id, int argc)
|
||||
int ospf_area_nssa_unset(struct ospf *ospf, struct in_addr area_id)
|
||||
{
|
||||
struct ospf_area *area;
|
||||
|
||||
@ -1709,22 +1712,14 @@ int ospf_area_nssa_unset(struct ospf *ospf, struct in_addr area_id, int argc)
|
||||
if (area == NULL)
|
||||
return 0;
|
||||
|
||||
/* argc < 5 -> 'no area x nssa' */
|
||||
if (argc < 5 && area->external_routing == OSPF_AREA_NSSA) {
|
||||
ospf->anyNSSA--;
|
||||
/* set NSSA area defaults */
|
||||
area->no_summary = 0;
|
||||
area->suppress_fa = 0;
|
||||
area->NSSATranslatorRole = OSPF_NSSA_ROLE_CANDIDATE;
|
||||
area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
|
||||
area->NSSATranslatorStabilityInterval =
|
||||
OSPF_NSSA_TRANS_STABLE_DEFAULT;
|
||||
area->NSSATranslatorStabilityInterval = OSPF_NSSA_TRANS_STABLE_DEFAULT;
|
||||
ospf_area_type_set(area, OSPF_AREA_DEFAULT);
|
||||
} else {
|
||||
ospf_area_nssa_translator_role_set(ospf, area_id,
|
||||
OSPF_NSSA_ROLE_CANDIDATE);
|
||||
}
|
||||
|
||||
ospf_area_check_free(ospf, area_id);
|
||||
|
||||
return 1;
|
||||
@ -1782,6 +1777,51 @@ int ospf_area_nssa_translator_role_set(struct ospf *ospf,
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ospf_area_nssa_default_originate_set(struct ospf *ospf,
|
||||
struct in_addr area_id, int metric,
|
||||
int metric_type)
|
||||
{
|
||||
struct ospf_area *area;
|
||||
|
||||
area = ospf_area_lookup_by_area_id(ospf, area_id);
|
||||
if (area == NULL)
|
||||
return;
|
||||
|
||||
if (!area->nssa_default_originate.enabled) {
|
||||
area->nssa_default_originate.enabled = true;
|
||||
if (++ospf->nssa_default_import_check.refcnt == 1) {
|
||||
ospf->nssa_default_import_check.status = false;
|
||||
ospf_zebra_import_default_route(ospf, false);
|
||||
}
|
||||
}
|
||||
|
||||
area->nssa_default_originate.metric_value = metric;
|
||||
area->nssa_default_originate.metric_type = metric_type;
|
||||
}
|
||||
|
||||
void ospf_area_nssa_default_originate_unset(struct ospf *ospf,
|
||||
struct in_addr area_id)
|
||||
{
|
||||
struct ospf_area *area;
|
||||
|
||||
area = ospf_area_lookup_by_area_id(ospf, area_id);
|
||||
if (area == NULL)
|
||||
return;
|
||||
|
||||
if (area->nssa_default_originate.enabled) {
|
||||
area->nssa_default_originate.enabled = false;
|
||||
if (--ospf->nssa_default_import_check.refcnt == 0) {
|
||||
ospf->nssa_default_import_check.status = false;
|
||||
ospf_zebra_import_default_route(ospf, true);
|
||||
}
|
||||
area->nssa_default_originate.metric_value = -1;
|
||||
area->nssa_default_originate.metric_type = -1;
|
||||
|
||||
if (!IS_OSPF_ABR(ospf))
|
||||
ospf_abr_nssa_type7_defaults(ospf);
|
||||
}
|
||||
}
|
||||
|
||||
int ospf_area_export_list_set(struct ospf *ospf, struct ospf_area *area,
|
||||
const char *list_name)
|
||||
{
|
||||
|
@ -302,6 +302,18 @@ struct ospf {
|
||||
|
||||
int default_metric; /* Default metric for redistribute. */
|
||||
|
||||
/* NSSA default-information-originate */
|
||||
struct {
|
||||
/* # of NSSA areas requesting default information */
|
||||
uint16_t refcnt;
|
||||
|
||||
/*
|
||||
* Whether a default route known through non-OSPF protocol is
|
||||
* present in the RIB.
|
||||
*/
|
||||
bool status;
|
||||
} nssa_default_import_check;
|
||||
|
||||
#define OSPF_LSA_REFRESHER_GRANULARITY 10
|
||||
#define OSPF_LSA_REFRESHER_SLOTS \
|
||||
((OSPF_LS_REFRESH_TIME + OSPF_LS_REFRESH_SHIFT) \
|
||||
@ -517,6 +529,7 @@ struct ospf_area {
|
||||
#define OSPF_TRANSIT_FALSE 0
|
||||
#define OSPF_TRANSIT_TRUE 1
|
||||
struct route_table *ranges; /* Configured Area Ranges. */
|
||||
struct route_table *nssa_ranges; /* Configured NSSA Area Ranges. */
|
||||
|
||||
/* RFC3137 stub router state flags for area */
|
||||
uint8_t stub_router_state;
|
||||
@ -561,6 +574,13 @@ struct ospf_area {
|
||||
#define PREFIX_LIST_OUT(A) (A)->plist_out.list
|
||||
#define PREFIX_NAME_OUT(A) (A)->plist_out.name
|
||||
|
||||
/* NSSA default-information-originate */
|
||||
struct {
|
||||
bool enabled;
|
||||
int metric_type;
|
||||
int metric_value;
|
||||
} nssa_default_originate;
|
||||
|
||||
/* Shortest Path Tree. */
|
||||
struct vertex *spf;
|
||||
struct list *spf_vertex_list;
|
||||
@ -697,14 +717,18 @@ extern int ospf_area_no_summary_set(struct ospf *ospf, struct in_addr area_id);
|
||||
extern int ospf_area_no_summary_unset(struct ospf *ospf,
|
||||
struct in_addr area_id);
|
||||
extern int ospf_area_nssa_set(struct ospf *ospf, struct in_addr area_id);
|
||||
extern int ospf_area_nssa_unset(struct ospf *ospf, struct in_addr area_id,
|
||||
int argc);
|
||||
extern int ospf_area_nssa_unset(struct ospf *ospf, struct in_addr area_id);
|
||||
extern int ospf_area_nssa_suppress_fa_set(struct ospf *ospf,
|
||||
struct in_addr area_id);
|
||||
extern int ospf_area_nssa_suppress_fa_unset(struct ospf *ospf,
|
||||
struct in_addr area_id);
|
||||
extern int ospf_area_nssa_translator_role_set(struct ospf *ospf,
|
||||
struct in_addr area_id, int role);
|
||||
extern void ospf_area_nssa_default_originate_set(struct ospf *ospf,
|
||||
struct in_addr area_id,
|
||||
int metric, int metric_type);
|
||||
extern void ospf_area_nssa_default_originate_unset(struct ospf *ospf,
|
||||
struct in_addr area_id);
|
||||
extern int ospf_area_export_list_set(struct ospf *ospf,
|
||||
struct ospf_area *area_id,
|
||||
const char *list_name);
|
||||
|
0
tests/topotests/ospf_nssa_topo1/__init__.py
Normal file
0
tests/topotests/ospf_nssa_topo1/__init__.py
Normal file
22
tests/topotests/ospf_nssa_topo1/rt1/ospfd.conf
Normal file
22
tests/topotests/ospf_nssa_topo1/rt1/ospfd.conf
Normal file
@ -0,0 +1,22 @@
|
||||
password 1
|
||||
hostname rt1
|
||||
log file ospfd.log
|
||||
!
|
||||
! debug ospf sr
|
||||
! debug ospf te
|
||||
! debug ospf event
|
||||
! debug ospf lsa
|
||||
! debug ospf zebra
|
||||
!
|
||||
interface lo
|
||||
ip ospf area 0
|
||||
!
|
||||
interface eth-rt2
|
||||
ip ospf network point-to-point
|
||||
ip ospf area 0
|
||||
ip ospf hello-interval 3
|
||||
ip ospf dead-interval 12
|
||||
!
|
||||
router ospf
|
||||
router-id 1.1.1.1
|
||||
!
|
6
tests/topotests/ospf_nssa_topo1/rt1/staticd.conf
Normal file
6
tests/topotests/ospf_nssa_topo1/rt1/staticd.conf
Normal file
@ -0,0 +1,6 @@
|
||||
log file staticd.log
|
||||
!
|
||||
hostname rt1
|
||||
!
|
||||
line vty
|
||||
!
|
115
tests/topotests/ospf_nssa_topo1/rt1/step1/show_ip_ospf_route.ref
Normal file
115
tests/topotests/ospf_nssa_topo1/rt1/step1/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,115 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -0,0 +1,115 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
115
tests/topotests/ospf_nssa_topo1/rt1/step2/show_ip_ospf_route.ref
Normal file
115
tests/topotests/ospf_nssa_topo1/rt1/step2/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,115 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
115
tests/topotests/ospf_nssa_topo1/rt1/step3/show_ip_ospf_route.ref
Normal file
115
tests/topotests/ospf_nssa_topo1/rt1/step3/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,115 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
103
tests/topotests/ospf_nssa_topo1/rt1/step4/show_ip_ospf_route.ref
Normal file
103
tests/topotests/ospf_nssa_topo1/rt1/step4/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,103 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
103
tests/topotests/ospf_nssa_topo1/rt1/step5/show_ip_ospf_route.ref
Normal file
103
tests/topotests/ospf_nssa_topo1/rt1/step5/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,103 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
103
tests/topotests/ospf_nssa_topo1/rt1/step7/show_ip_ospf_route.ref
Normal file
103
tests/topotests/ospf_nssa_topo1/rt1/step7/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,103 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
103
tests/topotests/ospf_nssa_topo1/rt1/step8/show_ip_ospf_route.ref
Normal file
103
tests/topotests/ospf_nssa_topo1/rt1/step8/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,103 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":1000,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
18
tests/topotests/ospf_nssa_topo1/rt1/zebra.conf
Normal file
18
tests/topotests/ospf_nssa_topo1/rt1/zebra.conf
Normal file
@ -0,0 +1,18 @@
|
||||
log file zebra.log
|
||||
!
|
||||
hostname rt1
|
||||
!
|
||||
! debug zebra kernel
|
||||
! debug zebra packet
|
||||
! debug zebra mpls
|
||||
!
|
||||
interface lo
|
||||
ip address 1.1.1.1/32
|
||||
!
|
||||
interface eth-rt2
|
||||
ip address 10.0.1.1/24
|
||||
!
|
||||
ip forwarding
|
||||
!
|
||||
line vty
|
||||
!
|
35
tests/topotests/ospf_nssa_topo1/rt2/ospfd.conf
Normal file
35
tests/topotests/ospf_nssa_topo1/rt2/ospfd.conf
Normal file
@ -0,0 +1,35 @@
|
||||
password 1
|
||||
hostname rt2
|
||||
log file ospfd.log
|
||||
!
|
||||
! debug ospf sr
|
||||
! debug ospf te
|
||||
! debug ospf event
|
||||
! debug ospf lsa
|
||||
! debug ospf zebra
|
||||
!
|
||||
interface lo
|
||||
ip ospf area 0
|
||||
!
|
||||
interface eth-rt1
|
||||
ip ospf network point-to-point
|
||||
ip ospf area 0
|
||||
ip ospf hello-interval 3
|
||||
ip ospf dead-interval 12
|
||||
!
|
||||
interface eth-rt3
|
||||
ip ospf network point-to-point
|
||||
ip ospf area 1
|
||||
ip ospf hello-interval 3
|
||||
ip ospf dead-interval 12
|
||||
!
|
||||
interface eth-rt4
|
||||
ip ospf network point-to-point
|
||||
ip ospf area 1
|
||||
ip ospf hello-interval 3
|
||||
ip ospf dead-interval 12
|
||||
!
|
||||
router ospf
|
||||
router-id 2.2.2.2
|
||||
area 1 nssa
|
||||
!
|
6
tests/topotests/ospf_nssa_topo1/rt2/staticd.conf
Normal file
6
tests/topotests/ospf_nssa_topo1/rt2/staticd.conf
Normal file
@ -0,0 +1,6 @@
|
||||
log file staticd.log
|
||||
!
|
||||
hostname rt2
|
||||
!
|
||||
line vty
|
||||
!
|
127
tests/topotests/ospf_nssa_topo1/rt2/step1/show_ip_ospf_route.ref
Normal file
127
tests/topotests/ospf_nssa_topo1/rt2/step1/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,127 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.1",
|
||||
"via":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -0,0 +1,127 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.1",
|
||||
"via":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
139
tests/topotests/ospf_nssa_topo1/rt2/step2/show_ip_ospf_route.ref
Normal file
139
tests/topotests/ospf_nssa_topo1/rt2/step2/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,139 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.1",
|
||||
"via":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":1,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
127
tests/topotests/ospf_nssa_topo1/rt2/step3/show_ip_ospf_route.ref
Normal file
127
tests/topotests/ospf_nssa_topo1/rt2/step3/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,127 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.1",
|
||||
"via":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
129
tests/topotests/ospf_nssa_topo1/rt2/step4/show_ip_ospf_route.ref
Normal file
129
tests/topotests/ospf_nssa_topo1/rt2/step4/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,129 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.1",
|
||||
"via":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
117
tests/topotests/ospf_nssa_topo1/rt2/step5/show_ip_ospf_route.ref
Normal file
117
tests/topotests/ospf_nssa_topo1/rt2/step5/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,117 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.1",
|
||||
"via":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
103
tests/topotests/ospf_nssa_topo1/rt2/step6/show_ip_ospf_route.ref
Normal file
103
tests/topotests/ospf_nssa_topo1/rt2/step6/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,103 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.1",
|
||||
"via":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
129
tests/topotests/ospf_nssa_topo1/rt2/step7/show_ip_ospf_route.ref
Normal file
129
tests/topotests/ospf_nssa_topo1/rt2/step7/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,129 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.1",
|
||||
"via":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
129
tests/topotests/ospf_nssa_topo1/rt2/step8/show_ip_ospf_route.ref
Normal file
129
tests/topotests/ospf_nssa_topo1/rt2/step8/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,129 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.1",
|
||||
"via":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
127
tests/topotests/ospf_nssa_topo1/rt2/step9/show_ip_ospf_route.ref
Normal file
127
tests/topotests/ospf_nssa_topo1/rt2/step9/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,127 @@
|
||||
{
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.1.1",
|
||||
"via":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.0",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt1"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.3",
|
||||
"via":"eth-rt3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.4",
|
||||
"via":"eth-rt4"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
24
tests/topotests/ospf_nssa_topo1/rt2/zebra.conf
Normal file
24
tests/topotests/ospf_nssa_topo1/rt2/zebra.conf
Normal file
@ -0,0 +1,24 @@
|
||||
log file zebra.log
|
||||
!
|
||||
hostname rt2
|
||||
!
|
||||
! debug zebra kernel
|
||||
! debug zebra packet
|
||||
! debug zebra mpls
|
||||
!
|
||||
interface lo
|
||||
ip address 2.2.2.2/32
|
||||
!
|
||||
interface eth-rt1
|
||||
ip address 10.0.1.2/24
|
||||
!
|
||||
interface eth-rt3
|
||||
ip address 10.0.2.2/24
|
||||
!
|
||||
interface eth-rt4
|
||||
ip address 10.0.3.2/24
|
||||
!
|
||||
ip forwarding
|
||||
!
|
||||
line vty
|
||||
!
|
24
tests/topotests/ospf_nssa_topo1/rt3/ospfd.conf
Normal file
24
tests/topotests/ospf_nssa_topo1/rt3/ospfd.conf
Normal file
@ -0,0 +1,24 @@
|
||||
password 1
|
||||
hostname rt3
|
||||
log file ospfd.log
|
||||
!
|
||||
! debug ospf sr
|
||||
! debug ospf te
|
||||
! debug ospf event
|
||||
! debug ospf lsa
|
||||
! debug ospf zebra
|
||||
!
|
||||
interface lo
|
||||
ip ospf area 1
|
||||
!
|
||||
interface eth-rt2
|
||||
ip ospf network point-to-point
|
||||
ip ospf area 1
|
||||
ip ospf hello-interval 3
|
||||
ip ospf dead-interval 12
|
||||
!
|
||||
router ospf
|
||||
router-id 3.3.3.3
|
||||
area 1 nssa
|
||||
redistribute connected
|
||||
!
|
8
tests/topotests/ospf_nssa_topo1/rt3/staticd.conf
Normal file
8
tests/topotests/ospf_nssa_topo1/rt3/staticd.conf
Normal file
@ -0,0 +1,8 @@
|
||||
log file staticd.log
|
||||
!
|
||||
hostname rt3
|
||||
!
|
||||
ip route 0.0.0.0/0 Null0
|
||||
!
|
||||
line vty
|
||||
!
|
138
tests/topotests/ospf_nssa_topo1/rt3/step1/show_ip_ospf_route.ref
Normal file
138
tests/topotests/ospf_nssa_topo1/rt3/step1/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,138 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -0,0 +1,150 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":1000,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
138
tests/topotests/ospf_nssa_topo1/rt3/step2/show_ip_ospf_route.ref
Normal file
138
tests/topotests/ospf_nssa_topo1/rt3/step2/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,138 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
138
tests/topotests/ospf_nssa_topo1/rt3/step3/show_ip_ospf_route.ref
Normal file
138
tests/topotests/ospf_nssa_topo1/rt3/step3/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,138 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
150
tests/topotests/ospf_nssa_topo1/rt3/step4/show_ip_ospf_route.ref
Normal file
150
tests/topotests/ospf_nssa_topo1/rt3/step4/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,150 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
138
tests/topotests/ospf_nssa_topo1/rt3/step5/show_ip_ospf_route.ref
Normal file
138
tests/topotests/ospf_nssa_topo1/rt3/step5/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,138 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
126
tests/topotests/ospf_nssa_topo1/rt3/step6/show_ip_ospf_route.ref
Normal file
126
tests/topotests/ospf_nssa_topo1/rt3/step6/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,126 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
150
tests/topotests/ospf_nssa_topo1/rt3/step7/show_ip_ospf_route.ref
Normal file
150
tests/topotests/ospf_nssa_topo1/rt3/step7/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,150 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
150
tests/topotests/ospf_nssa_topo1/rt3/step8/show_ip_ospf_route.ref
Normal file
150
tests/topotests/ospf_nssa_topo1/rt3/step8/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,150 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":1000,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
150
tests/topotests/ospf_nssa_topo1/rt3/step9/show_ip_ospf_route.ref
Normal file
150
tests/topotests/ospf_nssa_topo1/rt3/step9/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,150 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":1000,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.1\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.2\/32":{
|
||||
"routeType":"N E2",
|
||||
"cost":20,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.2.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
18
tests/topotests/ospf_nssa_topo1/rt3/zebra.conf
Normal file
18
tests/topotests/ospf_nssa_topo1/rt3/zebra.conf
Normal file
@ -0,0 +1,18 @@
|
||||
log file zebra.log
|
||||
!
|
||||
hostname rt3
|
||||
!
|
||||
! debug zebra kernel
|
||||
! debug zebra packet
|
||||
! debug zebra mpls
|
||||
!
|
||||
interface lo
|
||||
ip address 3.3.3.3/32
|
||||
!
|
||||
interface eth-rt2
|
||||
ip address 10.0.2.3/24
|
||||
!
|
||||
ip forwarding
|
||||
!
|
||||
line vty
|
||||
!
|
24
tests/topotests/ospf_nssa_topo1/rt4/ospfd.conf
Normal file
24
tests/topotests/ospf_nssa_topo1/rt4/ospfd.conf
Normal file
@ -0,0 +1,24 @@
|
||||
password 1
|
||||
hostname rt4
|
||||
log file ospfd.log
|
||||
!
|
||||
! debug ospf sr
|
||||
! debug ospf te
|
||||
! debug ospf event
|
||||
! debug ospf lsa
|
||||
! debug ospf zebra
|
||||
!
|
||||
interface lo
|
||||
ip ospf area 1
|
||||
!
|
||||
interface eth-rt2
|
||||
ip ospf network point-to-point
|
||||
ip ospf area 1
|
||||
ip ospf hello-interval 3
|
||||
ip ospf dead-interval 12
|
||||
!
|
||||
router ospf
|
||||
router-id 4.4.4.4
|
||||
area 1 nssa
|
||||
redistribute static
|
||||
!
|
9
tests/topotests/ospf_nssa_topo1/rt4/staticd.conf
Normal file
9
tests/topotests/ospf_nssa_topo1/rt4/staticd.conf
Normal file
@ -0,0 +1,9 @@
|
||||
log file staticd.log
|
||||
!
|
||||
hostname rt4
|
||||
!
|
||||
ip route 172.16.1.1/32 Null0
|
||||
ip route 172.16.1.2/32 Null0
|
||||
!
|
||||
line vty
|
||||
!
|
114
tests/topotests/ospf_nssa_topo1/rt4/step1/show_ip_ospf_route.ref
Normal file
114
tests/topotests/ospf_nssa_topo1/rt4/step1/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,114 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -0,0 +1,126 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":1000,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
114
tests/topotests/ospf_nssa_topo1/rt4/step2/show_ip_ospf_route.ref
Normal file
114
tests/topotests/ospf_nssa_topo1/rt4/step2/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,114 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
114
tests/topotests/ospf_nssa_topo1/rt4/step3/show_ip_ospf_route.ref
Normal file
114
tests/topotests/ospf_nssa_topo1/rt4/step3/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,114 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
126
tests/topotests/ospf_nssa_topo1/rt4/step4/show_ip_ospf_route.ref
Normal file
126
tests/topotests/ospf_nssa_topo1/rt4/step4/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,126 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
126
tests/topotests/ospf_nssa_topo1/rt4/step5/show_ip_ospf_route.ref
Normal file
126
tests/topotests/ospf_nssa_topo1/rt4/step5/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,126 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
126
tests/topotests/ospf_nssa_topo1/rt4/step6/show_ip_ospf_route.ref
Normal file
126
tests/topotests/ospf_nssa_topo1/rt4/step6/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,126 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
126
tests/topotests/ospf_nssa_topo1/rt4/step7/show_ip_ospf_route.ref
Normal file
126
tests/topotests/ospf_nssa_topo1/rt4/step7/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,126 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":20,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
126
tests/topotests/ospf_nssa_topo1/rt4/step8/show_ip_ospf_route.ref
Normal file
126
tests/topotests/ospf_nssa_topo1/rt4/step8/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,126 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":1000,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
126
tests/topotests/ospf_nssa_topo1/rt4/step9/show_ip_ospf_route.ref
Normal file
126
tests/topotests/ospf_nssa_topo1/rt4/step9/show_ip_ospf_route.ref
Normal file
@ -0,0 +1,126 @@
|
||||
{
|
||||
"0.0.0.0\/0":{
|
||||
"routeType":"N IA",
|
||||
"cost":11,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"1.1.1.1\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2\/32":{
|
||||
"routeType":"N IA",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3\/32":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"4.4.4.4\/32":{
|
||||
"routeType":"N",
|
||||
"cost":0,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"lo"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.1.0\/24":{
|
||||
"routeType":"N IA",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.2.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"10.0.3.0\/24":{
|
||||
"routeType":"N",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":" ",
|
||||
"directlyAttachedTo":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"2.2.2.2":{
|
||||
"routeType":"R ",
|
||||
"cost":10,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"abr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"3.3.3.3":{
|
||||
"routeType":"R ",
|
||||
"cost":20,
|
||||
"area":"0.0.0.1",
|
||||
"routerType":"asbr",
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
},
|
||||
"172.16.1.0\/24":{
|
||||
"routeType":"N E2",
|
||||
"cost":10,
|
||||
"type2cost":1000,
|
||||
"tag":0,
|
||||
"nexthops":[
|
||||
{
|
||||
"ip":"10.0.3.2",
|
||||
"via":"eth-rt2"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
18
tests/topotests/ospf_nssa_topo1/rt4/zebra.conf
Normal file
18
tests/topotests/ospf_nssa_topo1/rt4/zebra.conf
Normal file
@ -0,0 +1,18 @@
|
||||
log file zebra.log
|
||||
!
|
||||
hostname rt4
|
||||
!
|
||||
! debug zebra kernel
|
||||
! debug zebra packet
|
||||
! debug zebra mpls
|
||||
!
|
||||
interface lo
|
||||
ip address 4.4.4.4/32
|
||||
!
|
||||
interface eth-rt2
|
||||
ip address 10.0.3.4/24
|
||||
!
|
||||
ip forwarding
|
||||
!
|
||||
line vty
|
||||
!
|
416
tests/topotests/ospf_nssa_topo1/test_ospf_nssa_topo1.py
Normal file
416
tests/topotests/ospf_nssa_topo1/test_ospf_nssa_topo1.py
Normal file
@ -0,0 +1,416 @@
|
||||
#!/usr/bin/env python
|
||||
# SPDX-License-Identifier: ISC
|
||||
|
||||
#
|
||||
# test_ospf_nssa_topo1.py
|
||||
# Part of NetDEF Topology Tests
|
||||
#
|
||||
# Copyright (c) 2023 by
|
||||
# Network Device Education Foundation, Inc. ("NetDEF")
|
||||
#
|
||||
|
||||
"""
|
||||
test_ospf_nssa_topo1.py:
|
||||
|
||||
+---------+
|
||||
| RT1 |
|
||||
| 1.1.1.1 |
|
||||
+---------+
|
||||
|eth-rt2
|
||||
|
|
||||
|10.0.1.0/24
|
||||
|
|
||||
|eth-rt1
|
||||
+---------+
|
||||
| RT2 |
|
||||
| 2.2.2.2 |
|
||||
+---------+
|
||||
eth-rt3| |eth-rt4
|
||||
| |
|
||||
10.0.2.0/24 | | 10.0.3.0/24
|
||||
+---------+ +--------+
|
||||
| |
|
||||
|eth-rt2 |eth-rt2
|
||||
+---------+ +---------+
|
||||
| RT3 | | RT4 |
|
||||
| 3.3.3.3 | | 4.4.4.4 |
|
||||
+---------+ +---------+
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import pytest
|
||||
import json
|
||||
from functools import partial
|
||||
|
||||
# Save the Current Working Directory to find configuration files.
|
||||
CWD = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(CWD, "../"))
|
||||
|
||||
# pylint: disable=C0413
|
||||
# Import topogen and topotest helpers
|
||||
from lib import topotest
|
||||
from lib.topogen import Topogen, TopoRouter, get_topogen
|
||||
from lib.topolog import logger
|
||||
|
||||
# Required to instantiate the topology builder class.
|
||||
|
||||
pytestmark = [pytest.mark.ospfd]
|
||||
|
||||
|
||||
def build_topo(tgen):
|
||||
"Build function"
|
||||
|
||||
#
|
||||
# Define FRR Routers
|
||||
#
|
||||
for router in ["rt1", "rt2", "rt3", "rt4"]:
|
||||
tgen.add_router(router)
|
||||
|
||||
#
|
||||
# Define connections
|
||||
#
|
||||
switch = tgen.add_switch("s1")
|
||||
switch.add_link(tgen.gears["rt1"], nodeif="eth-rt2")
|
||||
switch.add_link(tgen.gears["rt2"], nodeif="eth-rt1")
|
||||
|
||||
switch = tgen.add_switch("s2")
|
||||
switch.add_link(tgen.gears["rt2"], nodeif="eth-rt3")
|
||||
switch.add_link(tgen.gears["rt3"], nodeif="eth-rt2")
|
||||
|
||||
switch = tgen.add_switch("s3")
|
||||
switch.add_link(tgen.gears["rt2"], nodeif="eth-rt4")
|
||||
switch.add_link(tgen.gears["rt4"], nodeif="eth-rt2")
|
||||
|
||||
|
||||
def setup_module(mod):
|
||||
"Sets up the pytest environment"
|
||||
tgen = Topogen(build_topo, mod.__name__)
|
||||
tgen.start_topology()
|
||||
|
||||
router_list = tgen.routers()
|
||||
|
||||
# For all registered routers, load the zebra configuration file
|
||||
for rname, router in router_list.items():
|
||||
router.load_config(
|
||||
TopoRouter.RD_ZEBRA, os.path.join(CWD, "{}/zebra.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_STATIC, os.path.join(CWD, "{}/staticd.conf".format(rname))
|
||||
)
|
||||
router.load_config(
|
||||
TopoRouter.RD_OSPF, os.path.join(CWD, "{}/ospfd.conf".format(rname))
|
||||
)
|
||||
|
||||
tgen.start_router()
|
||||
|
||||
|
||||
def teardown_module(mod):
|
||||
"Teardown the pytest environment"
|
||||
tgen = get_topogen()
|
||||
|
||||
# This function tears down the whole topology.
|
||||
tgen.stop_topology()
|
||||
|
||||
|
||||
def print_cmd_result(rname, command):
|
||||
print(get_topogen().gears[rname].vtysh_cmd(command, isjson=False))
|
||||
|
||||
|
||||
def router_compare_json_output(rname, command, reference):
|
||||
"Compare router JSON output"
|
||||
|
||||
logger.info('Comparing router "%s" "%s" output', rname, command)
|
||||
|
||||
tgen = get_topogen()
|
||||
filename = "{}/{}/{}".format(CWD, rname, reference)
|
||||
expected = json.loads(open(filename).read())
|
||||
|
||||
# Run test function until we get an result. Wait at most 60 seconds.
|
||||
test_func = partial(topotest.router_json_cmp, tgen.gears[rname], command, expected)
|
||||
_, diff = topotest.run_and_expect(test_func, None, count=120, wait=0.5)
|
||||
assertmsg = '"{}" JSON output mismatches the expected result'.format(rname)
|
||||
assert diff is None, assertmsg
|
||||
|
||||
|
||||
#
|
||||
# Step 1
|
||||
#
|
||||
# Test initial network convergence
|
||||
#
|
||||
def test_rib_step1():
|
||||
logger.info("Test (step 1): test initial network convergence")
|
||||
tgen = get_topogen()
|
||||
|
||||
# Skip if previous fatal error condition is raised
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
for rname in ["rt1", "rt2", "rt3", "rt4"]:
|
||||
router_compare_json_output(
|
||||
rname, "show ip ospf route json", "step1/show_ip_ospf_route.ref"
|
||||
)
|
||||
|
||||
|
||||
#
|
||||
# Step 2
|
||||
#
|
||||
# Action(s):
|
||||
# -rt3: configure an NSSA default route
|
||||
#
|
||||
# Expected changes:
|
||||
# -rt2: add NSSA default route pointing to rt3
|
||||
#
|
||||
def test_rib_step2():
|
||||
logger.info("Test (step 2): verify OSPF routes")
|
||||
tgen = get_topogen()
|
||||
|
||||
# Skip if previous fatal error condition is raised
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Adding NSSA default on rt4")
|
||||
tgen.net["rt3"].cmd(
|
||||
'vtysh -c "conf t" -c "router ospf" -c "area 1 nssa default-information-originate"'
|
||||
)
|
||||
|
||||
for rname in ["rt1", "rt2", "rt3", "rt4"]:
|
||||
router_compare_json_output(
|
||||
rname, "show ip ospf route json", "step2/show_ip_ospf_route.ref"
|
||||
)
|
||||
|
||||
|
||||
#
|
||||
# Step 3
|
||||
#
|
||||
# Action(s):
|
||||
# -rt3: remove NSSA default route
|
||||
#
|
||||
# Expected changes:
|
||||
# -rt2: remove NSSA default route
|
||||
#
|
||||
def test_rib_step3():
|
||||
logger.info("Test (step 3): verify OSPF routes")
|
||||
tgen = get_topogen()
|
||||
|
||||
# Skip if previous fatal error condition is raised
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Removing NSSA default on rt4")
|
||||
tgen.net["rt3"].cmd(
|
||||
'vtysh -c "conf t" -c "router ospf" -c "area 1 nssa"'
|
||||
)
|
||||
|
||||
for rname in ["rt1", "rt2", "rt3", "rt4"]:
|
||||
router_compare_json_output(
|
||||
rname, "show ip ospf route json", "step3/show_ip_ospf_route.ref"
|
||||
)
|
||||
|
||||
|
||||
#
|
||||
# Step 4
|
||||
#
|
||||
# Action(s):
|
||||
# -rt2: configure an NSSA range for 172.16.1.0/24
|
||||
#
|
||||
# Expected changes:
|
||||
# -rt1: the 172.16.1.1/32 and 172.16.1.2/32 routes should be removed
|
||||
# -rt1: the 172.16.1.0/24 route should be added
|
||||
#
|
||||
def test_rib_step4():
|
||||
logger.info("Test (step 4): verify OSPF routes")
|
||||
tgen = get_topogen()
|
||||
|
||||
# Skip if previous fatal error condition is raised
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Configuring NSSA range on rt2")
|
||||
tgen.net["rt2"].cmd(
|
||||
'vtysh -c "conf t" -c "router ospf" -c "area 1 nssa range 172.16.1.0/24"'
|
||||
)
|
||||
|
||||
for rname in ["rt1", "rt2", "rt3", "rt4"]:
|
||||
router_compare_json_output(
|
||||
rname, "show ip ospf route json", "step4/show_ip_ospf_route.ref"
|
||||
)
|
||||
|
||||
|
||||
#
|
||||
# Step 5
|
||||
#
|
||||
# Action(s):
|
||||
# -rt4: remove the 172.16.1.1/32 static route
|
||||
#
|
||||
# Expected changes:
|
||||
# -None (the 172.16.1.0/24 range is still active because of 172.16.1.2/32)
|
||||
#
|
||||
def test_rib_step5():
|
||||
logger.info("Test (step 5): verify OSPF routes")
|
||||
tgen = get_topogen()
|
||||
|
||||
# Skip if previous fatal error condition is raised
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Removing first static route in rt4")
|
||||
tgen.net["rt4"].cmd('vtysh -c "conf t" -c "no ip route 172.16.1.1/32 Null0"')
|
||||
|
||||
for rname in ["rt1", "rt2", "rt3", "rt4"]:
|
||||
router_compare_json_output(
|
||||
rname, "show ip ospf route json", "step5/show_ip_ospf_route.ref"
|
||||
)
|
||||
|
||||
|
||||
#
|
||||
# Step 6
|
||||
#
|
||||
# Action(s):
|
||||
# -rt4: remove the 172.16.1.2/32 static route
|
||||
#
|
||||
# Expected changes:
|
||||
# -rt1: remove the 172.16.1.0/24 route since the NSSA range is no longer active
|
||||
#
|
||||
def test_rib_step6():
|
||||
logger.info("Test (step 6): verify OSPF routes")
|
||||
tgen = get_topogen()
|
||||
|
||||
# Skip if previous fatal error condition is raised
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Removing second static route in rt4")
|
||||
tgen.net["rt4"].cmd('vtysh -c "conf t" -c "no ip route 172.16.1.2/32 Null0"')
|
||||
|
||||
for rname in ["rt1", "rt2", "rt3", "rt4"]:
|
||||
router_compare_json_output(
|
||||
rname, "show ip ospf route json", "step6/show_ip_ospf_route.ref"
|
||||
)
|
||||
|
||||
|
||||
#
|
||||
# Step 7
|
||||
#
|
||||
# Action(s):
|
||||
# -rt4: readd the 172.16.1.1/32 and 172.16.1.2/32 static routes
|
||||
#
|
||||
# Expected changes:
|
||||
# -rt1: readd the 172.16.1.0/24 route since the NSSA range is active again
|
||||
#
|
||||
def test_rib_step7():
|
||||
logger.info("Test (step 7): verify OSPF routes")
|
||||
tgen = get_topogen()
|
||||
|
||||
# Skip if previous fatal error condition is raised
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Readding static routes in rt4")
|
||||
tgen.net["rt4"].cmd('vtysh -c "conf t" -c "ip route 172.16.1.1/32 Null0"')
|
||||
tgen.net["rt4"].cmd('vtysh -c "conf t" -c "ip route 172.16.1.2/32 Null0"')
|
||||
|
||||
for rname in ["rt1", "rt2", "rt3", "rt4"]:
|
||||
router_compare_json_output(
|
||||
rname, "show ip ospf route json", "step7/show_ip_ospf_route.ref"
|
||||
)
|
||||
|
||||
|
||||
#
|
||||
# Step 8
|
||||
#
|
||||
# Action(s):
|
||||
# -rt2: update the NSSA range with a static cost
|
||||
#
|
||||
# Expected changes:
|
||||
# -rt1: update the metric of the 172.16.1.0/24 route from 20 to 1000
|
||||
#
|
||||
def test_rib_step8():
|
||||
logger.info("Test (step 8): verify OSPF routes")
|
||||
tgen = get_topogen()
|
||||
|
||||
# Skip if previous fatal error condition is raised
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Updating the NSSA range cost on rt2")
|
||||
tgen.net["rt2"].cmd(
|
||||
'vtysh -c "conf t" -c "router ospf" -c "area 1 nssa range 172.16.1.0/24 cost 1000"'
|
||||
)
|
||||
|
||||
for rname in ["rt1", "rt2", "rt3", "rt4"]:
|
||||
router_compare_json_output(
|
||||
rname, "show ip ospf route json", "step8/show_ip_ospf_route.ref"
|
||||
)
|
||||
|
||||
|
||||
#
|
||||
# Step 9
|
||||
#
|
||||
# Action(s):
|
||||
# -rt2: update the NSSA range to not advertise itself
|
||||
#
|
||||
# Expected changes:
|
||||
# -rt1: the 172.16.1.0/24 route should be removed
|
||||
#
|
||||
def test_rib_step9():
|
||||
logger.info("Test (step 9): verify OSPF routes")
|
||||
tgen = get_topogen()
|
||||
|
||||
# Skip if previous fatal error condition is raised
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Updating the NSSA range to not advertise itself")
|
||||
tgen.net["rt2"].cmd(
|
||||
'vtysh -c "conf t" -c "router ospf" -c "area 1 nssa range 172.16.1.0/24 not-advertise"'
|
||||
)
|
||||
|
||||
for rname in ["rt1", "rt2", "rt3", "rt4"]:
|
||||
router_compare_json_output(
|
||||
rname, "show ip ospf route json", "step9/show_ip_ospf_route.ref"
|
||||
)
|
||||
|
||||
|
||||
#
|
||||
# Step 10
|
||||
#
|
||||
# Action(s):
|
||||
# -rt2: remove the NSSA range
|
||||
#
|
||||
# Expected changes:
|
||||
# -rt1: the 172.16.1.1/32 and 172.16.1.2/32 routes should be added
|
||||
#
|
||||
def test_rib_step10():
|
||||
logger.info("Test (step 10): verify OSPF routes")
|
||||
tgen = get_topogen()
|
||||
|
||||
# Skip if previous fatal error condition is raised
|
||||
if tgen.routers_have_failure():
|
||||
pytest.skip(tgen.errors)
|
||||
|
||||
logger.info("Removing NSSA range on rt2")
|
||||
tgen.net["rt2"].cmd(
|
||||
'vtysh -c "conf t" -c "router ospf" -c "no area 1 nssa range 172.16.1.0/24"'
|
||||
)
|
||||
|
||||
for rname in ["rt1", "rt2", "rt3", "rt4"]:
|
||||
router_compare_json_output(
|
||||
rname, "show ip ospf route json", "step10/show_ip_ospf_route.ref"
|
||||
)
|
||||
|
||||
|
||||
# Memory leak test template
|
||||
def test_memory_leak():
|
||||
"Run the memory leak test and report results."
|
||||
tgen = get_topogen()
|
||||
if not tgen.is_memleak_enabled():
|
||||
pytest.skip("Memory leak test/report is disabled")
|
||||
|
||||
tgen.report_memory_leaks()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
args = ["-s"] + sys.argv[1:]
|
||||
sys.exit(pytest.main(args))
|
@ -111,9 +111,7 @@ def ospf_unconfigure_suppress_fa(router_name, area):
|
||||
|
||||
tgen = get_topogen()
|
||||
router = tgen.gears[router_name]
|
||||
router.vtysh_cmd(
|
||||
"conf t\nrouter ospf\nno area {} nssa suppress-fa\nexit\n".format(area)
|
||||
)
|
||||
router.vtysh_cmd("conf t\nrouter ospf\narea {} nssa\nexit\n".format(area))
|
||||
|
||||
|
||||
def ospf_get_lsa_type5(router_name):
|
||||
|
Loading…
Reference in New Issue
Block a user