Merge pull request #12969 from opensourcerouting/ospfd-nssa

ospfd: implement NSSA default routes & ranges
This commit is contained in:
Russ White 2023-04-04 09:38:55 -04:00 committed by GitHub
commit 4af5e39b2c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
68 changed files with 6324 additions and 358 deletions

View File

@ -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)

View File

@ -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,30 +1954,39 @@ 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;
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)
ospf_add_discard_route(
ospf, ospf->new_table,
area,
(struct prefix_ipv4
*)&rn->p);
else
ospf_delete_discard_route(
ospf, ospf->new_table,
(struct prefix_ipv4
*)&rn->p);
}
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;
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, nssa);
else
ospf_delete_discard_route(
ospf, ospf->new_table,
(struct prefix_ipv4 *)&rn->p, nssa);
}
}
}
/* This is the function taking care about ABR NSSA, i.e. 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__);

View File

@ -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);

View File

@ -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

View File

@ -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,

View File

@ -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,7 +1055,10 @@ 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;
new_or->path_type = OSPF_PATH_INTER_AREA;
if (nssa)
new_or->path_type = OSPF_PATH_TYPE2_EXTERNAL;
else
new_or->path_type = OSPF_PATH_INTER_AREA;
rn->info = new_or;
ospf_zebra_add_discard(ospf, p);
@ -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;

View File

@ -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 *);

View File

@ -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;

View File

@ -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);
else
ospf_area_no_summary_unset(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);

View File

@ -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,

View File

@ -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 *);

View File

@ -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;
ospf_area_type_set(area, OSPF_AREA_DEFAULT);
} else {
ospf_area_nssa_translator_role_set(ospf, area_id,
OSPF_NSSA_ROLE_CANDIDATE);
}
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;
ospf_area_type_set(area, OSPF_AREA_DEFAULT);
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)
{

View File

@ -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);

View 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
!

View File

@ -0,0 +1,6 @@
log file staticd.log
!
hostname rt1
!
line vty
!

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View File

@ -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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View File

@ -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"
}
]
}
}

View 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
!

View 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
!

View File

@ -0,0 +1,6 @@
log file staticd.log
!
hostname rt2
!
line vty
!

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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
!

View 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
!

View File

@ -0,0 +1,8 @@
log file staticd.log
!
hostname rt3
!
ip route 0.0.0.0/0 Null0
!
line vty
!

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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
!

View 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
!

View 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
!

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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"
}
]
}
}

View 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
!

View 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))

View File

@ -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):