mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-29 18:10:23 +00:00
Merge svn revisions 924 and 925 from Zebra CVS. Also remove useless
ospf6_lsdb prototype declaration from ospf6_lsa.h. Report sent to Yasuhiro Ohara as well.
This commit is contained in:
parent
0de1cde6e6
commit
3b68735fc3
@ -1,3 +1,8 @@
|
||||
2004-08-19 Yasuhiro Ohara <yasu@sfc.wide.ad.jp>
|
||||
|
||||
* ospf6_asbr.c: Bug in AS-External Origination fixed.
|
||||
* ospf6d.h: version 0.9.7j
|
||||
|
||||
2004-08-15 Yasuhiro Ohara <yasu@sfc.wide.ad.jp>
|
||||
|
||||
* *.c: Area support almost done. (almost ! ;p)
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "vty.h"
|
||||
#include "linklist.h"
|
||||
#include "command.h"
|
||||
#include "thread.h"
|
||||
|
||||
#include "ospf6_proto.h"
|
||||
#include "ospf6_route.h"
|
||||
@ -41,8 +42,9 @@
|
||||
#include "ospf6_interface.h"
|
||||
#include "ospf6_neighbor.h"
|
||||
|
||||
#include "ospf6_abr.h"
|
||||
#include "ospf6_flood.h"
|
||||
#include "ospf6_intra.h"
|
||||
#include "ospf6_abr.h"
|
||||
#include "ospf6d.h"
|
||||
|
||||
unsigned char conf_debug_ospf6_abr;
|
||||
@ -66,6 +68,80 @@ ospf6_is_router_abr (struct ospf6 *o)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
ospf6_abr_enable_area (struct ospf6_area *area)
|
||||
{
|
||||
struct ospf6_area *oa;
|
||||
struct ospf6_route *ro;
|
||||
listnode node;
|
||||
|
||||
for (node = listhead (area->ospf6->area_list); node; nextnode (node))
|
||||
{
|
||||
oa = OSPF6_AREA (getdata (node));
|
||||
|
||||
/* update B bit for each area */
|
||||
OSPF6_ROUTER_LSA_SCHEDULE (oa);
|
||||
|
||||
/* install other area's configured address range */
|
||||
if (oa != area)
|
||||
{
|
||||
for (ro = ospf6_route_head (oa->range_table); ro;
|
||||
ro = ospf6_route_next (ro))
|
||||
ospf6_abr_originate_summary_to_area (ro, area);
|
||||
}
|
||||
}
|
||||
|
||||
/* install calculated routes to border routers */
|
||||
for (ro = ospf6_route_head (area->ospf6->brouter_table); ro;
|
||||
ro = ospf6_route_next (ro))
|
||||
ospf6_abr_originate_summary_to_area (ro, area);
|
||||
|
||||
/* install calculated routes to network (may be rejected by ranges) */
|
||||
for (ro = ospf6_route_head (area->ospf6->route_table); ro;
|
||||
ro = ospf6_route_next (ro))
|
||||
ospf6_abr_originate_summary_to_area (ro, area);
|
||||
}
|
||||
|
||||
void
|
||||
ospf6_abr_disable_area (struct ospf6_area *area)
|
||||
{
|
||||
struct ospf6_area *oa;
|
||||
struct ospf6_route *ro;
|
||||
struct ospf6_lsa *old;
|
||||
listnode node;
|
||||
|
||||
/* Withdraw all summary prefixes previously originated */
|
||||
for (ro = ospf6_route_head (area->summary_prefix); ro;
|
||||
ro = ospf6_route_next (ro))
|
||||
{
|
||||
old = ospf6_lsdb_lookup (ro->path.origin.type, ro->path.origin.id,
|
||||
area->ospf6->router_id, area->lsdb);
|
||||
if (old)
|
||||
ospf6_lsa_purge (old);
|
||||
ospf6_route_remove (ro, area->summary_prefix);
|
||||
}
|
||||
|
||||
/* Withdraw all summary router-routes previously originated */
|
||||
for (ro = ospf6_route_head (area->summary_router); ro;
|
||||
ro = ospf6_route_next (ro))
|
||||
{
|
||||
old = ospf6_lsdb_lookup (ro->path.origin.type, ro->path.origin.id,
|
||||
area->ospf6->router_id, area->lsdb);
|
||||
if (old)
|
||||
ospf6_lsa_purge (old);
|
||||
ospf6_route_remove (ro, area->summary_router);
|
||||
}
|
||||
|
||||
/* Schedule Router-LSA for each area (ABR status may change) */
|
||||
for (node = listhead (area->ospf6->area_list); node; nextnode (node))
|
||||
{
|
||||
oa = OSPF6_AREA (getdata (node));
|
||||
|
||||
/* update B bit for each area */
|
||||
OSPF6_ROUTER_LSA_SCHEDULE (oa);
|
||||
}
|
||||
}
|
||||
|
||||
/* RFC 2328 12.4.3. Summary-LSAs */
|
||||
void
|
||||
ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
|
||||
@ -88,8 +164,7 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
|
||||
char buf[64];
|
||||
if (route->type == OSPF6_DEST_TYPE_ROUTER)
|
||||
{
|
||||
inet_ntop (AF_INET,
|
||||
&(ospf6_linkstate_prefix_adv_router (&route->prefix)),
|
||||
inet_ntop (AF_INET, &(ADV_ROUTER_IN_PREFIX (&route->prefix)),
|
||||
buf, sizeof (buf));
|
||||
zlog_info ("Originating summary in area %s for ASBR %s",
|
||||
area->name, buf);
|
||||
@ -314,8 +389,7 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
|
||||
router_lsa->options[1] = route->path.options[1];
|
||||
router_lsa->options[2] = route->path.options[2];
|
||||
OSPF6_ABR_SUMMARY_METRIC_SET (router_lsa, route->path.cost);
|
||||
router_lsa->router_id =
|
||||
ospf6_linkstate_prefix_adv_router (&route->prefix);
|
||||
router_lsa->router_id = ADV_ROUTER_IN_PREFIX (&route->prefix);
|
||||
type = htons (OSPF6_LSTYPE_INTER_ROUTER);
|
||||
}
|
||||
else
|
||||
@ -426,6 +500,9 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
|
||||
u_int32_t cost = 0;
|
||||
int i;
|
||||
|
||||
if (IS_OSPF6_DEBUG_ABR)
|
||||
zlog_info ("Examin %s in area %s", lsa->name, oa->name);
|
||||
|
||||
if (lsa->header->type == htons (OSPF6_LSTYPE_INTER_PREFIX))
|
||||
{
|
||||
struct ospf6_inter_prefix_lsa *prefix_lsa;
|
||||
@ -467,8 +544,18 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
|
||||
}
|
||||
|
||||
/* (1) if cost == LSInfinity or if the LSA is MaxAge */
|
||||
if (cost == LS_INFINITY || OSPF6_LSA_IS_MAXAGE (lsa))
|
||||
if (cost == LS_INFINITY)
|
||||
{
|
||||
if (IS_OSPF6_DEBUG_ABR)
|
||||
zlog_info ("cost is LS_INFINITY, ignore");
|
||||
if (old)
|
||||
ospf6_route_remove (old, oa->ospf6->route_table);
|
||||
return;
|
||||
}
|
||||
if (OSPF6_LSA_IS_MAXAGE (lsa))
|
||||
{
|
||||
if (IS_OSPF6_DEBUG_ABR)
|
||||
zlog_info ("LSA is MaxAge, ignore");
|
||||
if (old)
|
||||
ospf6_route_remove (old, oa->ospf6->route_table);
|
||||
return;
|
||||
@ -477,6 +564,8 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
|
||||
/* (2) if the LSA is self-originated, ignore */
|
||||
if (lsa->header->adv_router == oa->ospf6->router_id)
|
||||
{
|
||||
if (IS_OSPF6_DEBUG_ABR)
|
||||
zlog_info ("LSA is self-originated, ignore");
|
||||
if (old)
|
||||
ospf6_route_remove (old, oa->ospf6->route_table);
|
||||
return;
|
||||
@ -488,6 +577,8 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
|
||||
range = ospf6_route_lookup (&prefix, oa->range_table);
|
||||
if (range)
|
||||
{
|
||||
if (IS_OSPF6_DEBUG_ABR)
|
||||
zlog_info ("Prefix is equal to address range, ignore");
|
||||
if (old)
|
||||
ospf6_route_remove (old, oa->ospf6->route_table);
|
||||
return;
|
||||
@ -500,6 +591,8 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
|
||||
if (abr_entry == NULL || abr_entry->path.area_id != oa->area_id ||
|
||||
! CHECK_FLAG (abr_entry->path.router_bits, OSPF6_ROUTER_BIT_B))
|
||||
{
|
||||
if (IS_OSPF6_DEBUG_ABR)
|
||||
zlog_info ("ABR router entry does not exist, ignore");
|
||||
if (old)
|
||||
ospf6_route_remove (old, oa->ospf6->route_table);
|
||||
return;
|
||||
@ -528,6 +621,8 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
|
||||
for (i = 0; i < OSPF6_MULTI_PATH_LIMIT; i++)
|
||||
route->nexthop[i] = abr_entry->nexthop[i];
|
||||
|
||||
if (IS_OSPF6_DEBUG_ABR)
|
||||
zlog_info ("Install route");
|
||||
ospf6_route_add (route, table);
|
||||
}
|
||||
|
||||
|
@ -54,6 +54,9 @@ struct ospf6_inter_router_lsa
|
||||
|
||||
int ospf6_is_router_abr (struct ospf6 *o);
|
||||
|
||||
void ospf6_abr_enable_area (struct ospf6_area *oa);
|
||||
void ospf6_abr_disable_area (struct ospf6_area *oa);
|
||||
|
||||
void ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
|
||||
struct ospf6_area *area);
|
||||
void ospf6_abr_originate_summary (struct ospf6_route *route);
|
||||
|
@ -523,6 +523,7 @@ ospf6_asbr_redistribute_add (int type, int ifindex, struct prefix *prefix,
|
||||
zlog_info ("Advertise as AS-External Id:%s", ibuf);
|
||||
}
|
||||
|
||||
match->path.origin.id = htonl (info->id);
|
||||
ospf6_as_external_lsa_originate (match);
|
||||
return;
|
||||
}
|
||||
@ -571,6 +572,7 @@ ospf6_asbr_redistribute_add (int type, int ifindex, struct prefix *prefix,
|
||||
zlog_info ("Advertise as AS-External Id:%s", ibuf);
|
||||
}
|
||||
|
||||
route->path.origin.id = htonl (info->id);
|
||||
ospf6_as_external_lsa_originate (route);
|
||||
|
||||
/* Router-Bit (ASBR Flag) may have to be updated */
|
||||
|
@ -204,6 +204,7 @@ void
|
||||
ospf6_install_lsa (struct ospf6_lsa *lsa)
|
||||
{
|
||||
struct ospf6_lsa *old;
|
||||
struct timeval now;
|
||||
|
||||
if (IS_OSPF6_DEBUG_LSA (RECV) || IS_OSPF6_DEBUG_LSA (DATABASE))
|
||||
zlog_info ("Install LSA: %s", lsa->name);
|
||||
@ -213,10 +214,20 @@ ospf6_install_lsa (struct ospf6_lsa *lsa)
|
||||
old = ospf6_lsdb_lookup (lsa->header->type, lsa->header->id,
|
||||
lsa->header->adv_router, lsa->lsdb);
|
||||
if (old)
|
||||
{
|
||||
THREAD_OFF (old->expire);
|
||||
ospf6_flood_clear (old);
|
||||
}
|
||||
|
||||
gettimeofday (&now, (struct timezone *) NULL);
|
||||
if (ospf6_lsa_age_current (lsa) != MAXAGE)
|
||||
lsa->expire = thread_add_timer (master, ospf6_lsa_expire, lsa,
|
||||
MAXAGE + lsa->birth.tv_sec - now.tv_sec);
|
||||
else
|
||||
lsa->expire = NULL;
|
||||
|
||||
/* actually install */
|
||||
gettimeofday (&lsa->installed, (struct timezone *) NULL);
|
||||
lsa->installed = now;
|
||||
ospf6_lsdb_add (lsa, lsa->lsdb);
|
||||
|
||||
return;
|
||||
|
@ -1608,7 +1608,7 @@ DEFUN (no_debug_ospf6_interface,
|
||||
"Debug OSPFv3 Interface\n"
|
||||
)
|
||||
{
|
||||
OSPF6_DEBUG_INTERFACE_ON ();
|
||||
OSPF6_DEBUG_INTERFACE_OFF ();
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -109,7 +109,7 @@ ospf6_lsa_is_changed (struct ospf6_lsa *lsa1,
|
||||
}
|
||||
|
||||
/* ospf6 age functions */
|
||||
/* calculate birth and set expire timer */
|
||||
/* calculate birth */
|
||||
static void
|
||||
ospf6_lsa_age_set (struct ospf6_lsa *lsa)
|
||||
{
|
||||
@ -123,11 +123,7 @@ ospf6_lsa_age_set (struct ospf6_lsa *lsa)
|
||||
|
||||
lsa->birth.tv_sec = now.tv_sec - ntohs (lsa->header->age);
|
||||
lsa->birth.tv_usec = now.tv_usec;
|
||||
if (ntohs (lsa->header->age) != MAXAGE)
|
||||
lsa->expire = thread_add_timer (master, ospf6_lsa_expire, lsa,
|
||||
MAXAGE + lsa->birth.tv_sec - now.tv_sec);
|
||||
else
|
||||
lsa->expire = NULL;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -421,7 +417,7 @@ ospf6_lsa_create (struct ospf6_lsa_header *header)
|
||||
/* dump string */
|
||||
ospf6_lsa_printbuf (lsa, lsa->name, sizeof (lsa->name));
|
||||
|
||||
/* calculate birth, expire and refresh of this lsa */
|
||||
/* calculate birth of this lsa */
|
||||
ospf6_lsa_age_set (lsa);
|
||||
|
||||
if (IS_OSPF6_DEBUG_LSA (MEMORY))
|
||||
@ -456,7 +452,7 @@ ospf6_lsa_create_headeronly (struct ospf6_lsa_header *header)
|
||||
/* dump string */
|
||||
ospf6_lsa_printbuf (lsa, lsa->name, sizeof (lsa->name));
|
||||
|
||||
/* calculate birth, expire and refresh of this lsa */
|
||||
/* calculate birth of this lsa */
|
||||
ospf6_lsa_age_set (lsa);
|
||||
|
||||
if (IS_OSPF6_DEBUG_LSA (MEMORY))
|
||||
@ -500,6 +496,7 @@ ospf6_lsa_copy (struct ospf6_lsa *lsa)
|
||||
copy = ospf6_lsa_create (lsa->header);
|
||||
assert (copy->lock == 0);
|
||||
|
||||
copy->birth = lsa->birth;
|
||||
copy->installed = lsa->installed;
|
||||
copy->originated = lsa->originated;
|
||||
copy->lsdb = lsa->lsdb;
|
||||
@ -559,7 +556,7 @@ ospf6_lsa_expire (struct thread *thread)
|
||||
/* reinstall lsa */
|
||||
if (IS_OSPF6_DEBUG_LSA (DATABASE))
|
||||
zlog_info ("Reinstall MaxAge %s", lsa->name);
|
||||
ospf6_lsdb_add (lsa, lsa->lsdb);
|
||||
ospf6_install_lsa (lsa);
|
||||
|
||||
/* schedule maxage remover */
|
||||
ospf6_maxage_remove (ospf6);
|
||||
@ -584,6 +581,8 @@ ospf6_lsa_refresh (struct thread *thread)
|
||||
old->header->adv_router, lsdb_self);
|
||||
if (self == NULL)
|
||||
{
|
||||
if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
|
||||
zlog_info ("Refresh: could not find self LSA, flush %s", old->name);
|
||||
ospf6_lsa_premature_aging (old);
|
||||
return 0;
|
||||
}
|
||||
|
@ -121,7 +121,6 @@ struct ospf6_lsa
|
||||
|
||||
int retrans_count;
|
||||
|
||||
struct ospf6_lsdb;
|
||||
struct ospf6_lsdb *lsdb;
|
||||
|
||||
/* lsa instance */
|
||||
|
@ -83,15 +83,14 @@ _lsdb_count_assert (struct ospf6_lsdb *lsdb)
|
||||
if (num == lsdb->count)
|
||||
return;
|
||||
|
||||
if (IS_OSPF6_DEBUG_LSA (DATABASE))
|
||||
{
|
||||
zlog_info ("PANIC !! lsdb[%p]->count = %d, real = %d",
|
||||
lsdb, lsdb->count, num);
|
||||
for (debug = ospf6_lsdb_head (lsdb); debug;
|
||||
debug = ospf6_lsdb_next (debug))
|
||||
zlog_info ("%p %p %s", debug->prev, debug->next, debug->name);
|
||||
zlog_info ("%p %p %s lsdb[%p]", debug->prev, debug->next, debug->name,
|
||||
debug->lsdb);
|
||||
zlog_info ("DUMP END");
|
||||
}
|
||||
|
||||
assert (num == lsdb->count);
|
||||
}
|
||||
#define ospf6_lsdb_count_assert(t) (_lsdb_count_assert (t))
|
||||
|
@ -215,6 +215,11 @@ extern char *ospf6_path_type_substr[OSPF6_PATH_TYPE_MAX];
|
||||
#define ospf6_linkstate_prefix_id(x) \
|
||||
(*(u_int32_t *)(&(x)->u.prefix6.s6_addr[4]))
|
||||
|
||||
#define ID_IN_PREFIX(x) \
|
||||
(*(u_int32_t *)(&(x)->u.prefix6.s6_addr[0]))
|
||||
#define ADV_ROUTER_IN_PREFIX(x) \
|
||||
(*(u_int32_t *)(&(x)->u.prefix6.s6_addr[4]))
|
||||
|
||||
/* Function prototype */
|
||||
void ospf6_linkstate_prefix (u_int32_t adv_router, u_int32_t id,
|
||||
struct prefix *prefix);
|
||||
|
@ -151,7 +151,7 @@ ospf6_lsdesc_lsa (caddr_t lsdesc, struct ospf6_vertex *v)
|
||||
|
||||
lsa = ospf6_lsdb_lookup (type, id, adv_router, v->area->lsdb);
|
||||
|
||||
if (IS_OSPF6_DEBUG_SPF (DETAIL))
|
||||
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||
{
|
||||
char ibuf[16], abuf[16];
|
||||
inet_ntop (AF_INET, &id, ibuf, sizeof (ibuf));
|
||||
@ -212,7 +212,7 @@ ospf6_lsdesc_backlink (struct ospf6_lsa *lsa,
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_OSPF6_DEBUG_SPF (DETAIL))
|
||||
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||
zlog_info (" Backlink %s", (found ? "OK" : "FAIL"));
|
||||
|
||||
return found;
|
||||
@ -236,7 +236,7 @@ ospf6_nexthop_calc (struct ospf6_vertex *w, struct ospf6_vertex *v,
|
||||
oi = ospf6_interface_lookup_by_ifindex (ifindex);
|
||||
if (oi == NULL)
|
||||
{
|
||||
if (IS_OSPF6_DEBUG_SPF (SUMMARY))
|
||||
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||
zlog_warn ("Can't find interface in SPF: ifindex %d", ifindex);
|
||||
return;
|
||||
}
|
||||
@ -255,7 +255,7 @@ ospf6_nexthop_calc (struct ospf6_vertex *w, struct ospf6_vertex *v,
|
||||
continue;
|
||||
|
||||
link_lsa = (struct ospf6_link_lsa *) OSPF6_LSA_HEADER_END (lsa->header);
|
||||
if (IS_OSPF6_DEBUG_SPF (DETAIL))
|
||||
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||
{
|
||||
inet_ntop (AF_INET6, &link_lsa->linklocal_addr, buf, sizeof (buf));
|
||||
zlog_info (" nexthop %s from %s", buf, lsa->name);
|
||||
@ -270,7 +270,7 @@ ospf6_nexthop_calc (struct ospf6_vertex *w, struct ospf6_vertex *v,
|
||||
}
|
||||
}
|
||||
|
||||
if (i == 0 && IS_OSPF6_DEBUG_SPF (SUMMARY))
|
||||
if (i == 0 && IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||
zlog_info ("No nexthop for %s found", w->name);
|
||||
}
|
||||
|
||||
@ -283,14 +283,14 @@ ospf6_spf_install (struct ospf6_vertex *v,
|
||||
struct ospf6_vertex *prev, *w;
|
||||
listnode node;
|
||||
|
||||
if (IS_OSPF6_DEBUG_SPF (SUMMARY))
|
||||
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||
zlog_info ("SPF install %s hops %d cost %d",
|
||||
v->name, v->hops, v->cost);
|
||||
|
||||
route = ospf6_route_lookup (&v->vertex_id, result_table);
|
||||
if (route && route->path.cost < v->cost)
|
||||
{
|
||||
if (IS_OSPF6_DEBUG_SPF (SUMMARY))
|
||||
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||
zlog_info (" already installed with lower cost (%d), ignore",
|
||||
route->path.cost);
|
||||
ospf6_vertex_delete (v);
|
||||
@ -298,7 +298,7 @@ ospf6_spf_install (struct ospf6_vertex *v,
|
||||
}
|
||||
else if (route && route->path.cost == v->cost)
|
||||
{
|
||||
if (IS_OSPF6_DEBUG_SPF (SUMMARY))
|
||||
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||
zlog_info (" another path found, merge");
|
||||
|
||||
for (i = 0; ospf6_nexthop_is_set (&v->nexthop[i]) &&
|
||||
@ -477,7 +477,7 @@ ospf6_spf_calculation (u_int32_t router_id,
|
||||
}
|
||||
|
||||
/* add new candidate to the candidate_list */
|
||||
if (IS_OSPF6_DEBUG_SPF (SUMMARY))
|
||||
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||
zlog_info (" New candidate: %s hops %d cost %d",
|
||||
w->name, w->hops, w->cost);
|
||||
pqueue_enqueue (w, candidate_list);
|
||||
@ -496,7 +496,7 @@ ospf6_spf_calculation_thread (struct thread *t)
|
||||
oa = (struct ospf6_area *) THREAD_ARG (t);
|
||||
oa->thread_spf_calculation = NULL;
|
||||
|
||||
if (IS_OSPF6_DEBUG_SPF (SUMMARY))
|
||||
if (IS_OSPF6_DEBUG_SPF (PROCESS) || IS_OSPF6_DEBUG_SPF (TIME))
|
||||
zlog_info ("SPF calculation for area %s", oa->name);
|
||||
|
||||
/* execute SPF calculation */
|
||||
@ -504,7 +504,7 @@ ospf6_spf_calculation_thread (struct thread *t)
|
||||
ospf6_spf_calculation (oa->ospf6->router_id, oa->spf_table, oa);
|
||||
gettimeofday (&end, (struct timezone *) NULL);
|
||||
|
||||
if (IS_OSPF6_DEBUG_SPF (SUMMARY))
|
||||
if (IS_OSPF6_DEBUG_SPF (PROCESS) || IS_OSPF6_DEBUG_SPF (TIME))
|
||||
{
|
||||
timersub (&end, &start, &runtime);
|
||||
zlog_info ("SPF calculation for area %s: runtime %ld sec %ld usec",
|
||||
@ -558,62 +558,64 @@ ospf6_spf_display_subtree (struct vty *vty, char *prefix, int rest,
|
||||
free (next_prefix);
|
||||
}
|
||||
|
||||
DEFUN (debug_ospf6_spf_detail,
|
||||
debug_ospf6_spf_detail_cmd,
|
||||
"debug ospf6 spf detail",
|
||||
DEFUN (debug_ospf6_spf_process,
|
||||
debug_ospf6_spf_process_cmd,
|
||||
"debug ospf6 spf process",
|
||||
DEBUG_STR
|
||||
OSPF6_STR
|
||||
"Debug SPF Calculation\n"
|
||||
"Debug Detailed SPF\n"
|
||||
"Debug Detailed SPF Process\n"
|
||||
)
|
||||
{
|
||||
unsigned char level = 0;
|
||||
level = OSPF6_DEBUG_SPF_SUMMARY | OSPF6_DEBUG_SPF_DETAIL;
|
||||
level = OSPF6_DEBUG_SPF_PROCESS;
|
||||
OSPF6_DEBUG_SPF_ON (level);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (debug_ospf6_spf,
|
||||
debug_ospf6_spf_cmd,
|
||||
"debug ospf6 spf",
|
||||
DEFUN (debug_ospf6_spf_time,
|
||||
debug_ospf6_spf_time_cmd,
|
||||
"debug ospf6 spf time",
|
||||
DEBUG_STR
|
||||
OSPF6_STR
|
||||
"Debug SPF Calculation\n"
|
||||
"Measure time taken by SPF Calculation\n"
|
||||
)
|
||||
{
|
||||
unsigned char level = 0;
|
||||
level = OSPF6_DEBUG_SPF_SUMMARY;
|
||||
level = OSPF6_DEBUG_SPF_TIME;
|
||||
OSPF6_DEBUG_SPF_ON (level);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_debug_ospf6_spf_detail,
|
||||
no_debug_ospf6_spf_detail_cmd,
|
||||
"no debug ospf6 spf detail",
|
||||
DEFUN (no_debug_ospf6_spf_process,
|
||||
no_debug_ospf6_spf_process_cmd,
|
||||
"no debug ospf6 spf process",
|
||||
NO_STR
|
||||
DEBUG_STR
|
||||
OSPF6_STR
|
||||
"Quit Debugging SPF Calculation\n"
|
||||
"Quit Debugging Detailed SPF (change to debug summary)\n"
|
||||
"Quit Debugging Detailed SPF Process\n"
|
||||
)
|
||||
{
|
||||
unsigned char level = 0;
|
||||
level = OSPF6_DEBUG_SPF_DETAIL;
|
||||
level = OSPF6_DEBUG_SPF_PROCESS;
|
||||
OSPF6_DEBUG_SPF_OFF (level);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN (no_debug_ospf6_spf,
|
||||
no_debug_ospf6_spf_cmd,
|
||||
"no debug ospf6 spf",
|
||||
DEFUN (no_debug_ospf6_spf_time,
|
||||
no_debug_ospf6_spf_time_cmd,
|
||||
"no debug ospf6 spf time",
|
||||
NO_STR
|
||||
DEBUG_STR
|
||||
OSPF6_STR
|
||||
"Quit Debugging SPF Calculation\n"
|
||||
"Quit Measuring time taken by SPF Calculation\n"
|
||||
)
|
||||
{
|
||||
unsigned char level = 0;
|
||||
level = OSPF6_DEBUG_SPF_SUMMARY | OSPF6_DEBUG_SPF_DETAIL;
|
||||
level = OSPF6_DEBUG_SPF_TIME;
|
||||
OSPF6_DEBUG_SPF_OFF (level);
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
@ -621,24 +623,24 @@ DEFUN (no_debug_ospf6_spf,
|
||||
int
|
||||
config_write_ospf6_debug_spf (struct vty *vty)
|
||||
{
|
||||
if (IS_OSPF6_DEBUG_SPF (DETAIL))
|
||||
vty_out (vty, "debug ospf6 spf detail%s", VNL);
|
||||
else if (IS_OSPF6_DEBUG_SPF (SUMMARY))
|
||||
vty_out (vty, "debug ospf6 spf%s", VNL);
|
||||
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||
vty_out (vty, "debug ospf6 spf process%s", VNL);
|
||||
if (IS_OSPF6_DEBUG_SPF (TIME))
|
||||
vty_out (vty, "debug ospf6 spf time%s", VNL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
install_element_ospf6_debug_spf ()
|
||||
{
|
||||
install_element (ENABLE_NODE, &debug_ospf6_spf_cmd);
|
||||
install_element (ENABLE_NODE, &debug_ospf6_spf_detail_cmd);
|
||||
install_element (ENABLE_NODE, &no_debug_ospf6_spf_cmd);
|
||||
install_element (ENABLE_NODE, &no_debug_ospf6_spf_detail_cmd);
|
||||
install_element (CONFIG_NODE, &debug_ospf6_spf_cmd);
|
||||
install_element (CONFIG_NODE, &debug_ospf6_spf_detail_cmd);
|
||||
install_element (CONFIG_NODE, &no_debug_ospf6_spf_cmd);
|
||||
install_element (CONFIG_NODE, &no_debug_ospf6_spf_detail_cmd);
|
||||
install_element (ENABLE_NODE, &debug_ospf6_spf_process_cmd);
|
||||
install_element (ENABLE_NODE, &debug_ospf6_spf_time_cmd);
|
||||
install_element (ENABLE_NODE, &no_debug_ospf6_spf_process_cmd);
|
||||
install_element (ENABLE_NODE, &no_debug_ospf6_spf_time_cmd);
|
||||
install_element (CONFIG_NODE, &debug_ospf6_spf_process_cmd);
|
||||
install_element (CONFIG_NODE, &debug_ospf6_spf_time_cmd);
|
||||
install_element (CONFIG_NODE, &no_debug_ospf6_spf_process_cmd);
|
||||
install_element (CONFIG_NODE, &no_debug_ospf6_spf_time_cmd);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -24,8 +24,8 @@
|
||||
|
||||
/* Debug option */
|
||||
extern unsigned char conf_debug_ospf6_spf;
|
||||
#define OSPF6_DEBUG_SPF_SUMMARY 0x01
|
||||
#define OSPF6_DEBUG_SPF_DETAIL 0x02
|
||||
#define OSPF6_DEBUG_SPF_PROCESS 0x01
|
||||
#define OSPF6_DEBUG_SPF_TIME 0x02
|
||||
#define OSPF6_DEBUG_SPF_ON(level) \
|
||||
(conf_debug_ospf6_spf |= (level))
|
||||
#define OSPF6_DEBUG_SPF_OFF(level) \
|
||||
|
@ -335,12 +335,10 @@ DEFUN (ospf6_interface_area,
|
||||
)
|
||||
{
|
||||
struct ospf6 *o;
|
||||
struct ospf6_area *oa, *area;
|
||||
struct ospf6_area *oa;
|
||||
struct ospf6_interface *oi;
|
||||
struct interface *ifp;
|
||||
u_int32_t area_id;
|
||||
listnode node;
|
||||
struct ospf6_route *ro;
|
||||
|
||||
o = (struct ospf6 *) vty->index;
|
||||
|
||||
@ -377,25 +375,9 @@ DEFUN (ospf6_interface_area,
|
||||
/* start up */
|
||||
thread_add_event (master, interface_up, oi, 0);
|
||||
|
||||
/* ABR stuff, redistribute inter-area LSAs and
|
||||
re-originate Router-LSA (B-bit may have been changed) */
|
||||
for (node = listhead (o->area_list); node; nextnode (node))
|
||||
{
|
||||
area = OSPF6_AREA (getdata (node));
|
||||
OSPF6_ROUTER_LSA_SCHEDULE (area);
|
||||
|
||||
for (ro = ospf6_route_head (area->range_table); ro;
|
||||
ro = ospf6_route_next (ro))
|
||||
ospf6_abr_originate_summary_to_area (ro, oa);
|
||||
}
|
||||
|
||||
for (ro = ospf6_route_head (o->brouter_table); ro;
|
||||
ro = ospf6_route_next (ro))
|
||||
ospf6_abr_originate_summary_to_area (ro, oa);
|
||||
|
||||
for (ro = ospf6_route_head (o->route_table); ro;
|
||||
ro = ospf6_route_next (ro))
|
||||
ospf6_abr_originate_summary_to_area (ro, oa);
|
||||
/* If the router is ABR, originate summary routes */
|
||||
if (ospf6_is_router_abr (o))
|
||||
ospf6_abr_enable_area (oa);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
@ -412,12 +394,9 @@ DEFUN (no_ospf6_interface_area,
|
||||
{
|
||||
struct ospf6 *o;
|
||||
struct ospf6_interface *oi;
|
||||
struct ospf6_area *oa, *area;
|
||||
struct ospf6_area *oa;
|
||||
struct interface *ifp;
|
||||
u_int32_t area_id;
|
||||
listnode node;
|
||||
struct ospf6_route *ro;
|
||||
struct ospf6_lsa *old;
|
||||
|
||||
o = (struct ospf6 *) vty->index;
|
||||
|
||||
@ -459,35 +438,7 @@ DEFUN (no_ospf6_interface_area,
|
||||
if (oa->if_list->count == 0)
|
||||
{
|
||||
UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
|
||||
|
||||
for (ro = ospf6_route_head (oa->summary_prefix); ro;
|
||||
ro = ospf6_route_next (ro))
|
||||
{
|
||||
old = ospf6_lsdb_lookup (ro->path.origin.type,
|
||||
ro->path.origin.id,
|
||||
oa->ospf6->router_id, oa->lsdb);
|
||||
if (old)
|
||||
ospf6_lsa_purge (old);
|
||||
ospf6_route_remove (ro, oa->summary_prefix);
|
||||
}
|
||||
for (ro = ospf6_route_head (oa->summary_router); ro;
|
||||
ro = ospf6_route_next (ro))
|
||||
{
|
||||
old = ospf6_lsdb_lookup (ro->path.origin.type,
|
||||
ro->path.origin.id,
|
||||
oa->ospf6->router_id, oa->lsdb);
|
||||
if (old)
|
||||
ospf6_lsa_purge (old);
|
||||
ospf6_route_remove (ro, oa->summary_router);
|
||||
}
|
||||
}
|
||||
|
||||
/* Schedule Refreshment of Router-LSA for each area
|
||||
(ABR status may change) */
|
||||
for (node = listhead (o->area_list); node; nextnode (node))
|
||||
{
|
||||
area = OSPF6_AREA (getdata (node));
|
||||
OSPF6_ROUTER_LSA_SCHEDULE (area);
|
||||
ospf6_abr_disable_area (oa);
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
|
@ -50,91 +50,28 @@ ospf6_debug ()
|
||||
{
|
||||
}
|
||||
|
||||
static struct route_node *
|
||||
_route_next_until (struct route_node *node, struct route_node *limit)
|
||||
{
|
||||
struct route_node *next;
|
||||
struct route_node *start;
|
||||
|
||||
/* Node may be deleted from route_unlock_node so we have to preserve
|
||||
next node's pointer. */
|
||||
|
||||
if (node->l_left)
|
||||
{
|
||||
next = node->l_left;
|
||||
if (next == limit)
|
||||
{
|
||||
route_unlock_node (node);
|
||||
return NULL;
|
||||
}
|
||||
route_lock_node (next);
|
||||
route_unlock_node (node);
|
||||
return next;
|
||||
}
|
||||
if (node->l_right)
|
||||
{
|
||||
next = node->l_right;
|
||||
if (next == limit)
|
||||
{
|
||||
route_unlock_node (node);
|
||||
return NULL;
|
||||
}
|
||||
route_lock_node (next);
|
||||
route_unlock_node (node);
|
||||
return next;
|
||||
}
|
||||
|
||||
start = node;
|
||||
while (node->parent)
|
||||
{
|
||||
if (node->parent->l_left == node && node->parent->l_right)
|
||||
{
|
||||
next = node->parent->l_right;
|
||||
if (next == limit)
|
||||
{
|
||||
route_unlock_node (start);
|
||||
return NULL;
|
||||
}
|
||||
route_lock_node (next);
|
||||
route_unlock_node (start);
|
||||
return next;
|
||||
}
|
||||
node = node->parent;
|
||||
}
|
||||
|
||||
route_unlock_node (start);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct route_node *
|
||||
route_prev (struct route_node *node)
|
||||
{
|
||||
struct route_node *end;
|
||||
struct route_node *prev = NULL;
|
||||
|
||||
if (node->parent == NULL)
|
||||
{
|
||||
route_unlock_node (node);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (node->parent->l_left == node)
|
||||
{
|
||||
prev = node->parent;
|
||||
route_lock_node (prev);
|
||||
route_unlock_node (node);
|
||||
return prev;
|
||||
}
|
||||
|
||||
end = node;
|
||||
node = node->parent;
|
||||
if (node)
|
||||
route_lock_node (node);
|
||||
while (node)
|
||||
{
|
||||
prev = node;
|
||||
node = _route_next_until (node, end);
|
||||
node = route_next (node);
|
||||
if (node == end)
|
||||
{
|
||||
route_unlock_node (node);
|
||||
node = NULL;
|
||||
}
|
||||
}
|
||||
route_unlock_node (end);
|
||||
if (prev)
|
||||
route_lock_node (prev);
|
||||
|
||||
return prev;
|
||||
|
@ -22,7 +22,7 @@
|
||||
#ifndef OSPF6D_H
|
||||
#define OSPF6D_H
|
||||
|
||||
#define OSPF6_DAEMON_VERSION "0.9.7i"
|
||||
#define OSPF6_DAEMON_VERSION "0.9.7j"
|
||||
|
||||
/* global variables */
|
||||
extern int errno;
|
||||
|
Loading…
Reference in New Issue
Block a user