mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-30 20:21:02 +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>
|
2004-08-15 Yasuhiro Ohara <yasu@sfc.wide.ad.jp>
|
||||||
|
|
||||||
* *.c: Area support almost done. (almost ! ;p)
|
* *.c: Area support almost done. (almost ! ;p)
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include "vty.h"
|
#include "vty.h"
|
||||||
#include "linklist.h"
|
#include "linklist.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
|
#include "thread.h"
|
||||||
|
|
||||||
#include "ospf6_proto.h"
|
#include "ospf6_proto.h"
|
||||||
#include "ospf6_route.h"
|
#include "ospf6_route.h"
|
||||||
@ -41,8 +42,9 @@
|
|||||||
#include "ospf6_interface.h"
|
#include "ospf6_interface.h"
|
||||||
#include "ospf6_neighbor.h"
|
#include "ospf6_neighbor.h"
|
||||||
|
|
||||||
#include "ospf6_abr.h"
|
|
||||||
#include "ospf6_flood.h"
|
#include "ospf6_flood.h"
|
||||||
|
#include "ospf6_intra.h"
|
||||||
|
#include "ospf6_abr.h"
|
||||||
#include "ospf6d.h"
|
#include "ospf6d.h"
|
||||||
|
|
||||||
unsigned char conf_debug_ospf6_abr;
|
unsigned char conf_debug_ospf6_abr;
|
||||||
@ -66,6 +68,80 @@ ospf6_is_router_abr (struct ospf6 *o)
|
|||||||
return 0;
|
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 */
|
/* RFC 2328 12.4.3. Summary-LSAs */
|
||||||
void
|
void
|
||||||
ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
|
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];
|
char buf[64];
|
||||||
if (route->type == OSPF6_DEST_TYPE_ROUTER)
|
if (route->type == OSPF6_DEST_TYPE_ROUTER)
|
||||||
{
|
{
|
||||||
inet_ntop (AF_INET,
|
inet_ntop (AF_INET, &(ADV_ROUTER_IN_PREFIX (&route->prefix)),
|
||||||
&(ospf6_linkstate_prefix_adv_router (&route->prefix)),
|
|
||||||
buf, sizeof (buf));
|
buf, sizeof (buf));
|
||||||
zlog_info ("Originating summary in area %s for ASBR %s",
|
zlog_info ("Originating summary in area %s for ASBR %s",
|
||||||
area->name, buf);
|
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[1] = route->path.options[1];
|
||||||
router_lsa->options[2] = route->path.options[2];
|
router_lsa->options[2] = route->path.options[2];
|
||||||
OSPF6_ABR_SUMMARY_METRIC_SET (router_lsa, route->path.cost);
|
OSPF6_ABR_SUMMARY_METRIC_SET (router_lsa, route->path.cost);
|
||||||
router_lsa->router_id =
|
router_lsa->router_id = ADV_ROUTER_IN_PREFIX (&route->prefix);
|
||||||
ospf6_linkstate_prefix_adv_router (&route->prefix);
|
|
||||||
type = htons (OSPF6_LSTYPE_INTER_ROUTER);
|
type = htons (OSPF6_LSTYPE_INTER_ROUTER);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -426,6 +500,9 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
|
|||||||
u_int32_t cost = 0;
|
u_int32_t cost = 0;
|
||||||
int i;
|
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))
|
if (lsa->header->type == htons (OSPF6_LSTYPE_INTER_PREFIX))
|
||||||
{
|
{
|
||||||
struct ospf6_inter_prefix_lsa *prefix_lsa;
|
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 */
|
/* (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)
|
if (old)
|
||||||
ospf6_route_remove (old, oa->ospf6->route_table);
|
ospf6_route_remove (old, oa->ospf6->route_table);
|
||||||
return;
|
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 */
|
/* (2) if the LSA is self-originated, ignore */
|
||||||
if (lsa->header->adv_router == oa->ospf6->router_id)
|
if (lsa->header->adv_router == oa->ospf6->router_id)
|
||||||
{
|
{
|
||||||
|
if (IS_OSPF6_DEBUG_ABR)
|
||||||
|
zlog_info ("LSA is self-originated, ignore");
|
||||||
if (old)
|
if (old)
|
||||||
ospf6_route_remove (old, oa->ospf6->route_table);
|
ospf6_route_remove (old, oa->ospf6->route_table);
|
||||||
return;
|
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);
|
range = ospf6_route_lookup (&prefix, oa->range_table);
|
||||||
if (range)
|
if (range)
|
||||||
{
|
{
|
||||||
|
if (IS_OSPF6_DEBUG_ABR)
|
||||||
|
zlog_info ("Prefix is equal to address range, ignore");
|
||||||
if (old)
|
if (old)
|
||||||
ospf6_route_remove (old, oa->ospf6->route_table);
|
ospf6_route_remove (old, oa->ospf6->route_table);
|
||||||
return;
|
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 ||
|
if (abr_entry == NULL || abr_entry->path.area_id != oa->area_id ||
|
||||||
! CHECK_FLAG (abr_entry->path.router_bits, OSPF6_ROUTER_BIT_B))
|
! 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)
|
if (old)
|
||||||
ospf6_route_remove (old, oa->ospf6->route_table);
|
ospf6_route_remove (old, oa->ospf6->route_table);
|
||||||
return;
|
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++)
|
for (i = 0; i < OSPF6_MULTI_PATH_LIMIT; i++)
|
||||||
route->nexthop[i] = abr_entry->nexthop[i];
|
route->nexthop[i] = abr_entry->nexthop[i];
|
||||||
|
|
||||||
|
if (IS_OSPF6_DEBUG_ABR)
|
||||||
|
zlog_info ("Install route");
|
||||||
ospf6_route_add (route, table);
|
ospf6_route_add (route, table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,6 +54,9 @@ struct ospf6_inter_router_lsa
|
|||||||
|
|
||||||
int ospf6_is_router_abr (struct ospf6 *o);
|
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,
|
void ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
|
||||||
struct ospf6_area *area);
|
struct ospf6_area *area);
|
||||||
void ospf6_abr_originate_summary (struct ospf6_route *route);
|
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);
|
zlog_info ("Advertise as AS-External Id:%s", ibuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
match->path.origin.id = htonl (info->id);
|
||||||
ospf6_as_external_lsa_originate (match);
|
ospf6_as_external_lsa_originate (match);
|
||||||
return;
|
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);
|
zlog_info ("Advertise as AS-External Id:%s", ibuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
route->path.origin.id = htonl (info->id);
|
||||||
ospf6_as_external_lsa_originate (route);
|
ospf6_as_external_lsa_originate (route);
|
||||||
|
|
||||||
/* Router-Bit (ASBR Flag) may have to be updated */
|
/* Router-Bit (ASBR Flag) may have to be updated */
|
||||||
|
@ -204,6 +204,7 @@ void
|
|||||||
ospf6_install_lsa (struct ospf6_lsa *lsa)
|
ospf6_install_lsa (struct ospf6_lsa *lsa)
|
||||||
{
|
{
|
||||||
struct ospf6_lsa *old;
|
struct ospf6_lsa *old;
|
||||||
|
struct timeval now;
|
||||||
|
|
||||||
if (IS_OSPF6_DEBUG_LSA (RECV) || IS_OSPF6_DEBUG_LSA (DATABASE))
|
if (IS_OSPF6_DEBUG_LSA (RECV) || IS_OSPF6_DEBUG_LSA (DATABASE))
|
||||||
zlog_info ("Install LSA: %s", lsa->name);
|
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,
|
old = ospf6_lsdb_lookup (lsa->header->type, lsa->header->id,
|
||||||
lsa->header->adv_router, lsa->lsdb);
|
lsa->header->adv_router, lsa->lsdb);
|
||||||
if (old)
|
if (old)
|
||||||
|
{
|
||||||
|
THREAD_OFF (old->expire);
|
||||||
ospf6_flood_clear (old);
|
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 */
|
/* actually install */
|
||||||
gettimeofday (&lsa->installed, (struct timezone *) NULL);
|
lsa->installed = now;
|
||||||
ospf6_lsdb_add (lsa, lsa->lsdb);
|
ospf6_lsdb_add (lsa, lsa->lsdb);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -1608,7 +1608,7 @@ DEFUN (no_debug_ospf6_interface,
|
|||||||
"Debug OSPFv3 Interface\n"
|
"Debug OSPFv3 Interface\n"
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
OSPF6_DEBUG_INTERFACE_ON ();
|
OSPF6_DEBUG_INTERFACE_OFF ();
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ ospf6_lsa_is_changed (struct ospf6_lsa *lsa1,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ospf6 age functions */
|
/* ospf6 age functions */
|
||||||
/* calculate birth and set expire timer */
|
/* calculate birth */
|
||||||
static void
|
static void
|
||||||
ospf6_lsa_age_set (struct ospf6_lsa *lsa)
|
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_sec = now.tv_sec - ntohs (lsa->header->age);
|
||||||
lsa->birth.tv_usec = now.tv_usec;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -421,7 +417,7 @@ ospf6_lsa_create (struct ospf6_lsa_header *header)
|
|||||||
/* dump string */
|
/* dump string */
|
||||||
ospf6_lsa_printbuf (lsa, lsa->name, sizeof (lsa->name));
|
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);
|
ospf6_lsa_age_set (lsa);
|
||||||
|
|
||||||
if (IS_OSPF6_DEBUG_LSA (MEMORY))
|
if (IS_OSPF6_DEBUG_LSA (MEMORY))
|
||||||
@ -456,7 +452,7 @@ ospf6_lsa_create_headeronly (struct ospf6_lsa_header *header)
|
|||||||
/* dump string */
|
/* dump string */
|
||||||
ospf6_lsa_printbuf (lsa, lsa->name, sizeof (lsa->name));
|
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);
|
ospf6_lsa_age_set (lsa);
|
||||||
|
|
||||||
if (IS_OSPF6_DEBUG_LSA (MEMORY))
|
if (IS_OSPF6_DEBUG_LSA (MEMORY))
|
||||||
@ -500,6 +496,7 @@ ospf6_lsa_copy (struct ospf6_lsa *lsa)
|
|||||||
copy = ospf6_lsa_create (lsa->header);
|
copy = ospf6_lsa_create (lsa->header);
|
||||||
assert (copy->lock == 0);
|
assert (copy->lock == 0);
|
||||||
|
|
||||||
|
copy->birth = lsa->birth;
|
||||||
copy->installed = lsa->installed;
|
copy->installed = lsa->installed;
|
||||||
copy->originated = lsa->originated;
|
copy->originated = lsa->originated;
|
||||||
copy->lsdb = lsa->lsdb;
|
copy->lsdb = lsa->lsdb;
|
||||||
@ -559,7 +556,7 @@ ospf6_lsa_expire (struct thread *thread)
|
|||||||
/* reinstall lsa */
|
/* reinstall lsa */
|
||||||
if (IS_OSPF6_DEBUG_LSA (DATABASE))
|
if (IS_OSPF6_DEBUG_LSA (DATABASE))
|
||||||
zlog_info ("Reinstall MaxAge %s", lsa->name);
|
zlog_info ("Reinstall MaxAge %s", lsa->name);
|
||||||
ospf6_lsdb_add (lsa, lsa->lsdb);
|
ospf6_install_lsa (lsa);
|
||||||
|
|
||||||
/* schedule maxage remover */
|
/* schedule maxage remover */
|
||||||
ospf6_maxage_remove (ospf6);
|
ospf6_maxage_remove (ospf6);
|
||||||
@ -584,6 +581,8 @@ ospf6_lsa_refresh (struct thread *thread)
|
|||||||
old->header->adv_router, lsdb_self);
|
old->header->adv_router, lsdb_self);
|
||||||
if (self == NULL)
|
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);
|
ospf6_lsa_premature_aging (old);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,6 @@ struct ospf6_lsa
|
|||||||
|
|
||||||
int retrans_count;
|
int retrans_count;
|
||||||
|
|
||||||
struct ospf6_lsdb;
|
|
||||||
struct ospf6_lsdb *lsdb;
|
struct ospf6_lsdb *lsdb;
|
||||||
|
|
||||||
/* lsa instance */
|
/* lsa instance */
|
||||||
|
@ -83,15 +83,14 @@ _lsdb_count_assert (struct ospf6_lsdb *lsdb)
|
|||||||
if (num == lsdb->count)
|
if (num == lsdb->count)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (IS_OSPF6_DEBUG_LSA (DATABASE))
|
|
||||||
{
|
|
||||||
zlog_info ("PANIC !! lsdb[%p]->count = %d, real = %d",
|
zlog_info ("PANIC !! lsdb[%p]->count = %d, real = %d",
|
||||||
lsdb, lsdb->count, num);
|
lsdb, lsdb->count, num);
|
||||||
for (debug = ospf6_lsdb_head (lsdb); debug;
|
for (debug = ospf6_lsdb_head (lsdb); debug;
|
||||||
debug = ospf6_lsdb_next (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");
|
zlog_info ("DUMP END");
|
||||||
}
|
|
||||||
assert (num == lsdb->count);
|
assert (num == lsdb->count);
|
||||||
}
|
}
|
||||||
#define ospf6_lsdb_count_assert(t) (_lsdb_count_assert (t))
|
#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) \
|
#define ospf6_linkstate_prefix_id(x) \
|
||||||
(*(u_int32_t *)(&(x)->u.prefix6.s6_addr[4]))
|
(*(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 */
|
/* Function prototype */
|
||||||
void ospf6_linkstate_prefix (u_int32_t adv_router, u_int32_t id,
|
void ospf6_linkstate_prefix (u_int32_t adv_router, u_int32_t id,
|
||||||
struct prefix *prefix);
|
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);
|
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];
|
char ibuf[16], abuf[16];
|
||||||
inet_ntop (AF_INET, &id, ibuf, sizeof (ibuf));
|
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"));
|
zlog_info (" Backlink %s", (found ? "OK" : "FAIL"));
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
@ -236,7 +236,7 @@ ospf6_nexthop_calc (struct ospf6_vertex *w, struct ospf6_vertex *v,
|
|||||||
oi = ospf6_interface_lookup_by_ifindex (ifindex);
|
oi = ospf6_interface_lookup_by_ifindex (ifindex);
|
||||||
if (oi == NULL)
|
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);
|
zlog_warn ("Can't find interface in SPF: ifindex %d", ifindex);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -255,7 +255,7 @@ ospf6_nexthop_calc (struct ospf6_vertex *w, struct ospf6_vertex *v,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
link_lsa = (struct ospf6_link_lsa *) OSPF6_LSA_HEADER_END (lsa->header);
|
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));
|
inet_ntop (AF_INET6, &link_lsa->linklocal_addr, buf, sizeof (buf));
|
||||||
zlog_info (" nexthop %s from %s", buf, lsa->name);
|
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);
|
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;
|
struct ospf6_vertex *prev, *w;
|
||||||
listnode node;
|
listnode node;
|
||||||
|
|
||||||
if (IS_OSPF6_DEBUG_SPF (SUMMARY))
|
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||||
zlog_info ("SPF install %s hops %d cost %d",
|
zlog_info ("SPF install %s hops %d cost %d",
|
||||||
v->name, v->hops, v->cost);
|
v->name, v->hops, v->cost);
|
||||||
|
|
||||||
route = ospf6_route_lookup (&v->vertex_id, result_table);
|
route = ospf6_route_lookup (&v->vertex_id, result_table);
|
||||||
if (route && route->path.cost < v->cost)
|
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",
|
zlog_info (" already installed with lower cost (%d), ignore",
|
||||||
route->path.cost);
|
route->path.cost);
|
||||||
ospf6_vertex_delete (v);
|
ospf6_vertex_delete (v);
|
||||||
@ -298,7 +298,7 @@ ospf6_spf_install (struct ospf6_vertex *v,
|
|||||||
}
|
}
|
||||||
else if (route && route->path.cost == v->cost)
|
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");
|
zlog_info (" another path found, merge");
|
||||||
|
|
||||||
for (i = 0; ospf6_nexthop_is_set (&v->nexthop[i]) &&
|
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 */
|
/* 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",
|
zlog_info (" New candidate: %s hops %d cost %d",
|
||||||
w->name, w->hops, w->cost);
|
w->name, w->hops, w->cost);
|
||||||
pqueue_enqueue (w, candidate_list);
|
pqueue_enqueue (w, candidate_list);
|
||||||
@ -496,7 +496,7 @@ ospf6_spf_calculation_thread (struct thread *t)
|
|||||||
oa = (struct ospf6_area *) THREAD_ARG (t);
|
oa = (struct ospf6_area *) THREAD_ARG (t);
|
||||||
oa->thread_spf_calculation = NULL;
|
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);
|
zlog_info ("SPF calculation for area %s", oa->name);
|
||||||
|
|
||||||
/* execute SPF calculation */
|
/* 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);
|
ospf6_spf_calculation (oa->ospf6->router_id, oa->spf_table, oa);
|
||||||
gettimeofday (&end, (struct timezone *) NULL);
|
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);
|
timersub (&end, &start, &runtime);
|
||||||
zlog_info ("SPF calculation for area %s: runtime %ld sec %ld usec",
|
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);
|
free (next_prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (debug_ospf6_spf_detail,
|
DEFUN (debug_ospf6_spf_process,
|
||||||
debug_ospf6_spf_detail_cmd,
|
debug_ospf6_spf_process_cmd,
|
||||||
"debug ospf6 spf detail",
|
"debug ospf6 spf process",
|
||||||
DEBUG_STR
|
DEBUG_STR
|
||||||
OSPF6_STR
|
OSPF6_STR
|
||||||
"Debug SPF Calculation\n"
|
"Debug SPF Calculation\n"
|
||||||
"Debug Detailed SPF\n"
|
"Debug Detailed SPF Process\n"
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
unsigned char level = 0;
|
unsigned char level = 0;
|
||||||
level = OSPF6_DEBUG_SPF_SUMMARY | OSPF6_DEBUG_SPF_DETAIL;
|
level = OSPF6_DEBUG_SPF_PROCESS;
|
||||||
OSPF6_DEBUG_SPF_ON (level);
|
OSPF6_DEBUG_SPF_ON (level);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (debug_ospf6_spf,
|
DEFUN (debug_ospf6_spf_time,
|
||||||
debug_ospf6_spf_cmd,
|
debug_ospf6_spf_time_cmd,
|
||||||
"debug ospf6 spf",
|
"debug ospf6 spf time",
|
||||||
DEBUG_STR
|
DEBUG_STR
|
||||||
OSPF6_STR
|
OSPF6_STR
|
||||||
"Debug SPF Calculation\n"
|
"Debug SPF Calculation\n"
|
||||||
|
"Measure time taken by SPF Calculation\n"
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
unsigned char level = 0;
|
unsigned char level = 0;
|
||||||
level = OSPF6_DEBUG_SPF_SUMMARY;
|
level = OSPF6_DEBUG_SPF_TIME;
|
||||||
OSPF6_DEBUG_SPF_ON (level);
|
OSPF6_DEBUG_SPF_ON (level);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (no_debug_ospf6_spf_detail,
|
DEFUN (no_debug_ospf6_spf_process,
|
||||||
no_debug_ospf6_spf_detail_cmd,
|
no_debug_ospf6_spf_process_cmd,
|
||||||
"no debug ospf6 spf detail",
|
"no debug ospf6 spf process",
|
||||||
NO_STR
|
NO_STR
|
||||||
DEBUG_STR
|
DEBUG_STR
|
||||||
OSPF6_STR
|
OSPF6_STR
|
||||||
"Quit Debugging SPF Calculation\n"
|
"Quit Debugging SPF Calculation\n"
|
||||||
"Quit Debugging Detailed SPF (change to debug summary)\n"
|
"Quit Debugging Detailed SPF Process\n"
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
unsigned char level = 0;
|
unsigned char level = 0;
|
||||||
level = OSPF6_DEBUG_SPF_DETAIL;
|
level = OSPF6_DEBUG_SPF_PROCESS;
|
||||||
OSPF6_DEBUG_SPF_OFF (level);
|
OSPF6_DEBUG_SPF_OFF (level);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (no_debug_ospf6_spf,
|
DEFUN (no_debug_ospf6_spf_time,
|
||||||
no_debug_ospf6_spf_cmd,
|
no_debug_ospf6_spf_time_cmd,
|
||||||
"no debug ospf6 spf",
|
"no debug ospf6 spf time",
|
||||||
NO_STR
|
NO_STR
|
||||||
DEBUG_STR
|
DEBUG_STR
|
||||||
OSPF6_STR
|
OSPF6_STR
|
||||||
"Quit Debugging SPF Calculation\n"
|
"Quit Debugging SPF Calculation\n"
|
||||||
|
"Quit Measuring time taken by SPF Calculation\n"
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
unsigned char level = 0;
|
unsigned char level = 0;
|
||||||
level = OSPF6_DEBUG_SPF_SUMMARY | OSPF6_DEBUG_SPF_DETAIL;
|
level = OSPF6_DEBUG_SPF_TIME;
|
||||||
OSPF6_DEBUG_SPF_OFF (level);
|
OSPF6_DEBUG_SPF_OFF (level);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -621,24 +623,24 @@ DEFUN (no_debug_ospf6_spf,
|
|||||||
int
|
int
|
||||||
config_write_ospf6_debug_spf (struct vty *vty)
|
config_write_ospf6_debug_spf (struct vty *vty)
|
||||||
{
|
{
|
||||||
if (IS_OSPF6_DEBUG_SPF (DETAIL))
|
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||||
vty_out (vty, "debug ospf6 spf detail%s", VNL);
|
vty_out (vty, "debug ospf6 spf process%s", VNL);
|
||||||
else if (IS_OSPF6_DEBUG_SPF (SUMMARY))
|
if (IS_OSPF6_DEBUG_SPF (TIME))
|
||||||
vty_out (vty, "debug ospf6 spf%s", VNL);
|
vty_out (vty, "debug ospf6 spf time%s", VNL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
install_element_ospf6_debug_spf ()
|
install_element_ospf6_debug_spf ()
|
||||||
{
|
{
|
||||||
install_element (ENABLE_NODE, &debug_ospf6_spf_cmd);
|
install_element (ENABLE_NODE, &debug_ospf6_spf_process_cmd);
|
||||||
install_element (ENABLE_NODE, &debug_ospf6_spf_detail_cmd);
|
install_element (ENABLE_NODE, &debug_ospf6_spf_time_cmd);
|
||||||
install_element (ENABLE_NODE, &no_debug_ospf6_spf_cmd);
|
install_element (ENABLE_NODE, &no_debug_ospf6_spf_process_cmd);
|
||||||
install_element (ENABLE_NODE, &no_debug_ospf6_spf_detail_cmd);
|
install_element (ENABLE_NODE, &no_debug_ospf6_spf_time_cmd);
|
||||||
install_element (CONFIG_NODE, &debug_ospf6_spf_cmd);
|
install_element (CONFIG_NODE, &debug_ospf6_spf_process_cmd);
|
||||||
install_element (CONFIG_NODE, &debug_ospf6_spf_detail_cmd);
|
install_element (CONFIG_NODE, &debug_ospf6_spf_time_cmd);
|
||||||
install_element (CONFIG_NODE, &no_debug_ospf6_spf_cmd);
|
install_element (CONFIG_NODE, &no_debug_ospf6_spf_process_cmd);
|
||||||
install_element (CONFIG_NODE, &no_debug_ospf6_spf_detail_cmd);
|
install_element (CONFIG_NODE, &no_debug_ospf6_spf_time_cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -24,8 +24,8 @@
|
|||||||
|
|
||||||
/* Debug option */
|
/* Debug option */
|
||||||
extern unsigned char conf_debug_ospf6_spf;
|
extern unsigned char conf_debug_ospf6_spf;
|
||||||
#define OSPF6_DEBUG_SPF_SUMMARY 0x01
|
#define OSPF6_DEBUG_SPF_PROCESS 0x01
|
||||||
#define OSPF6_DEBUG_SPF_DETAIL 0x02
|
#define OSPF6_DEBUG_SPF_TIME 0x02
|
||||||
#define OSPF6_DEBUG_SPF_ON(level) \
|
#define OSPF6_DEBUG_SPF_ON(level) \
|
||||||
(conf_debug_ospf6_spf |= (level))
|
(conf_debug_ospf6_spf |= (level))
|
||||||
#define OSPF6_DEBUG_SPF_OFF(level) \
|
#define OSPF6_DEBUG_SPF_OFF(level) \
|
||||||
|
@ -335,12 +335,10 @@ DEFUN (ospf6_interface_area,
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
struct ospf6 *o;
|
struct ospf6 *o;
|
||||||
struct ospf6_area *oa, *area;
|
struct ospf6_area *oa;
|
||||||
struct ospf6_interface *oi;
|
struct ospf6_interface *oi;
|
||||||
struct interface *ifp;
|
struct interface *ifp;
|
||||||
u_int32_t area_id;
|
u_int32_t area_id;
|
||||||
listnode node;
|
|
||||||
struct ospf6_route *ro;
|
|
||||||
|
|
||||||
o = (struct ospf6 *) vty->index;
|
o = (struct ospf6 *) vty->index;
|
||||||
|
|
||||||
@ -377,25 +375,9 @@ DEFUN (ospf6_interface_area,
|
|||||||
/* start up */
|
/* start up */
|
||||||
thread_add_event (master, interface_up, oi, 0);
|
thread_add_event (master, interface_up, oi, 0);
|
||||||
|
|
||||||
/* ABR stuff, redistribute inter-area LSAs and
|
/* If the router is ABR, originate summary routes */
|
||||||
re-originate Router-LSA (B-bit may have been changed) */
|
if (ospf6_is_router_abr (o))
|
||||||
for (node = listhead (o->area_list); node; nextnode (node))
|
ospf6_abr_enable_area (oa);
|
||||||
{
|
|
||||||
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);
|
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -412,12 +394,9 @@ DEFUN (no_ospf6_interface_area,
|
|||||||
{
|
{
|
||||||
struct ospf6 *o;
|
struct ospf6 *o;
|
||||||
struct ospf6_interface *oi;
|
struct ospf6_interface *oi;
|
||||||
struct ospf6_area *oa, *area;
|
struct ospf6_area *oa;
|
||||||
struct interface *ifp;
|
struct interface *ifp;
|
||||||
u_int32_t area_id;
|
u_int32_t area_id;
|
||||||
listnode node;
|
|
||||||
struct ospf6_route *ro;
|
|
||||||
struct ospf6_lsa *old;
|
|
||||||
|
|
||||||
o = (struct ospf6 *) vty->index;
|
o = (struct ospf6 *) vty->index;
|
||||||
|
|
||||||
@ -459,35 +438,7 @@ DEFUN (no_ospf6_interface_area,
|
|||||||
if (oa->if_list->count == 0)
|
if (oa->if_list->count == 0)
|
||||||
{
|
{
|
||||||
UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
|
UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
|
||||||
|
ospf6_abr_disable_area (oa);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CMD_SUCCESS;
|
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 *
|
struct route_node *
|
||||||
route_prev (struct route_node *node)
|
route_prev (struct route_node *node)
|
||||||
{
|
{
|
||||||
struct route_node *end;
|
struct route_node *end;
|
||||||
struct route_node *prev = NULL;
|
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;
|
end = node;
|
||||||
node = node->parent;
|
node = node->parent;
|
||||||
|
if (node)
|
||||||
route_lock_node (node);
|
route_lock_node (node);
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
prev = 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);
|
route_unlock_node (end);
|
||||||
|
if (prev)
|
||||||
route_lock_node (prev);
|
route_lock_node (prev);
|
||||||
|
|
||||||
return prev;
|
return prev;
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#ifndef OSPF6D_H
|
#ifndef OSPF6D_H
|
||||||
#define OSPF6D_H
|
#define OSPF6D_H
|
||||||
|
|
||||||
#define OSPF6_DAEMON_VERSION "0.9.7i"
|
#define OSPF6_DAEMON_VERSION "0.9.7j"
|
||||||
|
|
||||||
/* global variables */
|
/* global variables */
|
||||||
extern int errno;
|
extern int errno;
|
||||||
|
Loading…
Reference in New Issue
Block a user