summaryrefslogtreecommitdiffstats
path: root/ospf6d/ospf6_asbr.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospf6d/ospf6_asbr.c')
-rw-r--r--ospf6d/ospf6_asbr.c81
1 files changed, 66 insertions, 15 deletions
diff --git a/ospf6d/ospf6_asbr.c b/ospf6d/ospf6_asbr.c
index ae0a286d..3605e3f8 100644
--- a/ospf6d/ospf6_asbr.c
+++ b/ospf6d/ospf6_asbr.c
@@ -174,13 +174,20 @@ ospf6_asbr_lsa_add (struct ospf6_lsa *lsa)
return;
}
- if (OSPF6_ASBR_METRIC (external) == LS_INFINITY)
+ if (OSPF6_ASBR_METRIC (external) == OSPF_LS_INFINITY)
{
if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
zlog_debug ("Ignore LSA with LSInfinity Metric");
return;
}
+ if (CHECK_FLAG(external->prefix.prefix_options, OSPF6_PREFIX_OPTION_NU))
+ {
+ if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
+ zlog_debug ("Ignore LSA with NU bit set Metric");
+ return;
+ }
+
ospf6_linkstate_prefix (lsa->header->adv_router, htonl (0), &asbr_id);
asbr_entry = ospf6_route_lookup (&asbr_id, ospf6->brouter_table);
if (asbr_entry == NULL ||
@@ -402,6 +409,8 @@ ospf6_asbr_redistribute_unset (int type)
ospf6_asbr_redistribute_remove (info->type, route->nexthop[0].ifindex,
&route->prefix);
}
+
+ ospf6_asbr_routemap_unset (type);
}
void
@@ -629,7 +638,6 @@ DEFUN (ospf6_redistribute,
return CMD_WARNING;
ospf6_asbr_redistribute_unset (type);
- ospf6_asbr_routemap_unset (type);
ospf6_asbr_redistribute_set (type);
return CMD_SUCCESS;
}
@@ -670,7 +678,6 @@ DEFUN (no_ospf6_redistribute,
return CMD_WARNING;
ospf6_asbr_redistribute_unset (type);
- ospf6_asbr_routemap_unset (type);
return CMD_SUCCESS;
}
@@ -890,7 +897,7 @@ ospf6_routemap_rule_set_metric_compile (const char *arg)
u_int32_t metric;
char *endp;
metric = strtoul (arg, &endp, 0);
- if (metric > LS_INFINITY || *endp != '\0')
+ if (metric > OSPF_LS_INFINITY || *endp != '\0')
return NULL;
return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
}
@@ -1161,12 +1168,44 @@ ospf6_routemap_init (void)
/* Display functions */
+static char *
+ospf6_as_external_lsa_get_prefix_str (struct ospf6_lsa *lsa, char *buf,
+ int buflen, int pos)
+{
+ struct ospf6_as_external_lsa *external;
+ struct in6_addr in6;
+ int prefix_length = 0;
+
+ if (lsa)
+ {
+ external = (struct ospf6_as_external_lsa *)
+ OSPF6_LSA_HEADER_END (lsa->header);
+
+ if (pos == 0)
+ {
+ ospf6_prefix_in6_addr (&in6, &external->prefix);
+ prefix_length = external->prefix.prefix_length;
+ }
+ else {
+ in6 = *((struct in6_addr *)
+ ((caddr_t) external + sizeof (struct ospf6_as_external_lsa) +
+ OSPF6_PREFIX_SPACE (external->prefix.prefix_length)));
+ }
+ if (buf)
+ {
+ inet_ntop (AF_INET6, &in6, buf, buflen);
+ if (prefix_length)
+ sprintf (&buf[strlen(buf)], "/%d", prefix_length);
+ }
+ }
+ return (buf);
+}
+
static int
ospf6_as_external_lsa_show (struct vty *vty, struct ospf6_lsa *lsa)
{
struct ospf6_as_external_lsa *external;
char buf[64];
- struct in6_addr in6, *forwarding;
assert (lsa->header);
external = (struct ospf6_as_external_lsa *)
@@ -1191,19 +1230,15 @@ ospf6_as_external_lsa_show (struct vty *vty, struct ospf6_lsa *lsa)
ntohs (external->prefix.prefix_refer_lstype),
VNL);
- ospf6_prefix_in6_addr (&in6, &external->prefix);
- inet_ntop (AF_INET6, &in6, buf, sizeof (buf));
- vty_out (vty, " Prefix: %s/%d%s", buf,
- external->prefix.prefix_length, VNL);
+ vty_out (vty, " Prefix: %s%s",
+ ospf6_as_external_lsa_get_prefix_str (lsa, buf, sizeof(buf), 0), VNL);
/* Forwarding-Address */
if (CHECK_FLAG (external->bits_metric, OSPF6_ASBR_BIT_F))
{
- forwarding = (struct in6_addr *)
- ((caddr_t) external + sizeof (struct ospf6_as_external_lsa) +
- OSPF6_PREFIX_SPACE (external->prefix.prefix_length));
- inet_ntop (AF_INET6, forwarding, buf, sizeof (buf));
- vty_out (vty, " Forwarding-Address: %s%s", buf, VNL);
+ vty_out (vty, " Forwarding-Address: %s%s",
+ ospf6_as_external_lsa_get_prefix_str (lsa, buf, sizeof(buf), 1),
+ VNL);
}
return 0;
@@ -1257,7 +1292,9 @@ struct ospf6_lsa_handler as_external_handler =
{
OSPF6_LSTYPE_AS_EXTERNAL,
"AS-External",
- ospf6_as_external_lsa_show
+ "ASE",
+ ospf6_as_external_lsa_show,
+ ospf6_as_external_lsa_get_prefix_str
};
void
@@ -1276,6 +1313,20 @@ ospf6_asbr_init (void)
}
void
+ospf6_asbr_redistribute_reset (void)
+{
+ int type;
+
+ for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
+ {
+ if (type == ZEBRA_ROUTE_OSPF6)
+ continue;
+ if (ospf6_zebra_is_redistribute (type))
+ ospf6_asbr_redistribute_unset(type);
+ }
+}
+
+void
ospf6_asbr_terminate (void)
{
route_map_finish ();