version 1.1.1.1, 2012/02/21 17:26:12
|
version 1.1.1.2, 2016/11/02 10:09:12
|
Line 54 ospf6_lsdb_create (void *data)
|
Line 54 ospf6_lsdb_create (void *data)
|
void |
void |
ospf6_lsdb_delete (struct ospf6_lsdb *lsdb) |
ospf6_lsdb_delete (struct ospf6_lsdb *lsdb) |
{ |
{ |
ospf6_lsdb_remove_all (lsdb); | if (lsdb != NULL) |
route_table_finish (lsdb->table); | { |
XFREE (MTYPE_OSPF6_LSDB, lsdb); | ospf6_lsdb_remove_all (lsdb); |
| route_table_finish (lsdb->table); |
| XFREE (MTYPE_OSPF6_LSDB, lsdb); |
| } |
} |
} |
|
|
static void |
static void |
Line 70 ospf6_lsdb_set_key (struct prefix_ipv6 *key, void *val
|
Line 73 ospf6_lsdb_set_key (struct prefix_ipv6 *key, void *val
|
key->prefixlen += len * 8; |
key->prefixlen += len * 8; |
} |
} |
|
|
#ifndef NDEBUG | #ifdef DEBUG |
static void |
static void |
_lsdb_count_assert (struct ospf6_lsdb *lsdb) |
_lsdb_count_assert (struct ospf6_lsdb *lsdb) |
{ |
{ |
Line 94 _lsdb_count_assert (struct ospf6_lsdb *lsdb)
|
Line 97 _lsdb_count_assert (struct ospf6_lsdb *lsdb)
|
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)) |
#else /*NDEBUG*/ | #else /*DEBUG*/ |
#define ospf6_lsdb_count_assert(t) ((void) 0) |
#define ospf6_lsdb_count_assert(t) ((void) 0) |
#endif /*NDEBUG*/ | #endif /*DEBUG*/ |
|
|
void |
void |
ospf6_lsdb_add (struct ospf6_lsa *lsa, struct ospf6_lsdb *lsdb) |
ospf6_lsdb_add (struct ospf6_lsa *lsa, struct ospf6_lsdb *lsdb) |
{ |
{ |
struct prefix_ipv6 key; |
struct prefix_ipv6 key; |
struct route_node *current, *nextnode, *prevnode; | struct route_node *current; |
struct ospf6_lsa *next, *prev, *old = NULL; | struct ospf6_lsa *old = NULL; |
|
|
memset (&key, 0, sizeof (key)); |
memset (&key, 0, sizeof (key)); |
ospf6_lsdb_set_key (&key, &lsa->header->type, sizeof (lsa->header->type)); |
ospf6_lsdb_set_key (&key, &lsa->header->type, sizeof (lsa->header->type)); |
Line 114 ospf6_lsdb_add (struct ospf6_lsa *lsa, struct ospf6_ls
|
Line 117 ospf6_lsdb_add (struct ospf6_lsa *lsa, struct ospf6_ls
|
current = route_node_get (lsdb->table, (struct prefix *) &key); |
current = route_node_get (lsdb->table, (struct prefix *) &key); |
old = current->info; |
old = current->info; |
current->info = lsa; |
current->info = lsa; |
|
lsa->rn = current; |
ospf6_lsa_lock (lsa); |
ospf6_lsa_lock (lsa); |
|
|
if (old) | if (!old) |
{ |
{ |
if (old->prev) | lsdb->count++; |
old->prev->next = lsa; | |
if (old->next) | |
old->next->prev = lsa; | |
lsa->next = old->next; | |
lsa->prev = old->prev; | |
} | |
else | |
{ | |
/* next link */ | |
nextnode = current; | |
route_lock_node (nextnode); | |
do { | |
nextnode = route_next (nextnode); | |
} while (nextnode && nextnode->info == NULL); | |
if (nextnode == NULL) | |
lsa->next = NULL; | |
else | |
{ | |
next = nextnode->info; | |
lsa->next = next; | |
next->prev = lsa; | |
route_unlock_node (nextnode); | |
} | |
|
|
/* prev link */ | if (OSPF6_LSA_IS_MAXAGE (lsa)) |
prevnode = current; | { |
route_lock_node (prevnode); | if (lsdb->hook_remove) |
do { | (*lsdb->hook_remove) (lsa); |
prevnode = route_prev (prevnode); | } |
} while (prevnode && prevnode->info == NULL); | |
if (prevnode == NULL) | |
lsa->prev = NULL; | |
else |
else |
{ | { |
prev = prevnode->info; | if (lsdb->hook_add) |
lsa->prev = prev; | (*lsdb->hook_add) (lsa); |
prev->next = lsa; | } |
route_unlock_node (prevnode); | |
} | |
| |
lsdb->count++; | |
} |
} |
| else |
if (old) | |
{ |
{ |
if (OSPF6_LSA_IS_CHANGED (old, lsa)) |
if (OSPF6_LSA_IS_CHANGED (old, lsa)) |
{ |
{ |
Line 187 ospf6_lsdb_add (struct ospf6_lsa *lsa, struct ospf6_ls
|
Line 160 ospf6_lsdb_add (struct ospf6_lsa *lsa, struct ospf6_ls
|
(*lsdb->hook_add) (lsa); |
(*lsdb->hook_add) (lsa); |
} |
} |
} |
} |
|
ospf6_lsa_unlock (old); |
} |
} |
else if (OSPF6_LSA_IS_MAXAGE (lsa)) |
|
{ |
|
if (lsdb->hook_remove) |
|
(*lsdb->hook_remove) (lsa); |
|
} |
|
else |
|
{ |
|
if (lsdb->hook_add) |
|
(*lsdb->hook_add) (lsa); |
|
} |
|
|
|
if (old) |
|
ospf6_lsa_unlock (old); |
|
|
|
ospf6_lsdb_count_assert (lsdb); |
ospf6_lsdb_count_assert (lsdb); |
} |
} |
|
|
Line 220 ospf6_lsdb_remove (struct ospf6_lsa *lsa, struct ospf6
|
Line 181 ospf6_lsdb_remove (struct ospf6_lsa *lsa, struct ospf6
|
node = route_node_lookup (lsdb->table, (struct prefix *) &key); |
node = route_node_lookup (lsdb->table, (struct prefix *) &key); |
assert (node && node->info == lsa); |
assert (node && node->info == lsa); |
|
|
if (lsa->prev) |
|
lsa->prev->next = lsa->next; |
|
if (lsa->next) |
|
lsa->next->prev = lsa->prev; |
|
|
|
node->info = NULL; |
node->info = NULL; |
lsdb->count--; |
lsdb->count--; |
|
|
if (lsdb->hook_remove) |
if (lsdb->hook_remove) |
(*lsdb->hook_remove) (lsa); |
(*lsdb->hook_remove) (lsa); |
|
|
|
route_unlock_node (node); /* to free the lookup lock */ |
|
route_unlock_node (node); /* to free the original lock */ |
ospf6_lsa_unlock (lsa); |
ospf6_lsa_unlock (lsa); |
route_unlock_node (node); |
|
|
|
ospf6_lsdb_count_assert (lsdb); |
ospf6_lsdb_count_assert (lsdb); |
} |
} |
Line 255 ospf6_lsdb_lookup (u_int16_t type, u_int32_t id, u_int
|
Line 212 ospf6_lsdb_lookup (u_int16_t type, u_int32_t id, u_int
|
node = route_node_lookup (lsdb->table, (struct prefix *) &key); |
node = route_node_lookup (lsdb->table, (struct prefix *) &key); |
if (node == NULL || node->info == NULL) |
if (node == NULL || node->info == NULL) |
return NULL; |
return NULL; |
|
|
|
route_unlock_node (node); |
return (struct ospf6_lsa *) node->info; |
return (struct ospf6_lsa *) node->info; |
} |
} |
|
|
Line 306 ospf6_lsdb_lookup_next (u_int16_t type, u_int32_t id,
|
Line 265 ospf6_lsdb_lookup_next (u_int16_t type, u_int32_t id,
|
|
|
if (prefix_same (&node->p, p)) |
if (prefix_same (&node->p, p)) |
{ |
{ |
struct route_node *prev = node; |
|
struct ospf6_lsa *lsa_prev; |
|
struct ospf6_lsa *lsa_next; |
|
|
|
node = route_next (node); |
node = route_next (node); |
while (node && node->info == NULL) |
while (node && node->info == NULL) |
node = route_next (node); |
node = route_next (node); |
|
|
lsa_prev = prev->info; |
|
lsa_next = (node ? node->info : NULL); |
|
assert (lsa_prev); |
|
assert (lsa_prev->next == lsa_next); |
|
if (lsa_next) |
|
assert (lsa_next->prev == lsa_prev); |
|
zlog_debug ("lsdb_lookup_next: assert OK with previous LSA"); |
|
} |
} |
|
|
if (! node) |
if (! node) |
Line 346 ospf6_lsdb_head (struct ospf6_lsdb *lsdb)
|
Line 293 ospf6_lsdb_head (struct ospf6_lsdb *lsdb)
|
if (node == NULL) |
if (node == NULL) |
return NULL; |
return NULL; |
|
|
route_unlock_node (node); |
|
if (node->info) |
if (node->info) |
ospf6_lsa_lock ((struct ospf6_lsa *) node->info); |
ospf6_lsa_lock ((struct ospf6_lsa *) node->info); |
return (struct ospf6_lsa *) node->info; |
return (struct ospf6_lsa *) node->info; |
Line 355 ospf6_lsdb_head (struct ospf6_lsdb *lsdb)
|
Line 301 ospf6_lsdb_head (struct ospf6_lsdb *lsdb)
|
struct ospf6_lsa * |
struct ospf6_lsa * |
ospf6_lsdb_next (struct ospf6_lsa *lsa) |
ospf6_lsdb_next (struct ospf6_lsa *lsa) |
{ |
{ |
struct ospf6_lsa *next = lsa->next; | struct route_node *node = lsa->rn; |
| struct ospf6_lsa *next = NULL; |
|
|
ospf6_lsa_unlock (lsa); | do { |
if (next) | node = route_next (node); |
ospf6_lsa_lock (next); | } while (node && node->info == NULL); |
|
|
|
if ((node != NULL) && (node->info != NULL)) |
|
{ |
|
next = node->info; |
|
ospf6_lsa_lock (next); |
|
} |
|
|
|
ospf6_lsa_unlock (lsa); |
return next; |
return next; |
} |
} |
|
|
Line 390 ospf6_lsdb_type_router_head (u_int16_t type, u_int32_t
|
Line 344 ospf6_lsdb_type_router_head (u_int16_t type, u_int32_t
|
|
|
if (node == NULL) |
if (node == NULL) |
return NULL; |
return NULL; |
else |
|
route_unlock_node (node); |
|
|
|
if (! prefix_match ((struct prefix *) &key, &node->p)) |
if (! prefix_match ((struct prefix *) &key, &node->p)) |
return NULL; |
return NULL; |
Line 406 struct ospf6_lsa *
|
Line 358 struct ospf6_lsa *
|
ospf6_lsdb_type_router_next (u_int16_t type, u_int32_t adv_router, |
ospf6_lsdb_type_router_next (u_int16_t type, u_int32_t adv_router, |
struct ospf6_lsa *lsa) |
struct ospf6_lsa *lsa) |
{ |
{ |
struct ospf6_lsa *next = lsa->next; | struct ospf6_lsa *next = ospf6_lsdb_next(lsa); |
|
|
if (next) |
if (next) |
{ |
{ |
if (next->header->type != type || |
if (next->header->type != type || |
next->header->adv_router != adv_router) |
next->header->adv_router != adv_router) |
next = NULL; | { |
| route_unlock_node (next->rn); |
| ospf6_lsa_unlock (next); |
| next = NULL; |
| } |
} |
} |
|
|
if (next) |
|
ospf6_lsa_lock (next); |
|
ospf6_lsa_unlock (lsa); |
|
return next; |
return next; |
} |
} |
|
|
Line 444 ospf6_lsdb_type_head (u_int16_t type, struct ospf6_lsd
|
Line 397 ospf6_lsdb_type_head (u_int16_t type, struct ospf6_lsd
|
|
|
if (node == NULL) |
if (node == NULL) |
return NULL; |
return NULL; |
else |
|
route_unlock_node (node); |
|
|
|
if (! prefix_match ((struct prefix *) &key, &node->p)) |
if (! prefix_match ((struct prefix *) &key, &node->p)) |
return NULL; |
return NULL; |
Line 459 ospf6_lsdb_type_head (u_int16_t type, struct ospf6_lsd
|
Line 410 ospf6_lsdb_type_head (u_int16_t type, struct ospf6_lsd
|
struct ospf6_lsa * |
struct ospf6_lsa * |
ospf6_lsdb_type_next (u_int16_t type, struct ospf6_lsa *lsa) |
ospf6_lsdb_type_next (u_int16_t type, struct ospf6_lsa *lsa) |
{ |
{ |
struct ospf6_lsa *next = lsa->next; | struct ospf6_lsa *next = ospf6_lsdb_next (lsa); |
|
|
if (next) |
if (next) |
{ |
{ |
if (next->header->type != type) |
if (next->header->type != type) |
next = NULL; | { |
| route_unlock_node (next->rn); |
| ospf6_lsa_unlock (next); |
| next = NULL; |
| } |
} |
} |
|
|
if (next) |
|
ospf6_lsa_lock (next); |
|
ospf6_lsa_unlock (lsa); |
|
return next; |
return next; |
} |
} |
|
|
Line 477 void
|
Line 429 void
|
ospf6_lsdb_remove_all (struct ospf6_lsdb *lsdb) |
ospf6_lsdb_remove_all (struct ospf6_lsdb *lsdb) |
{ |
{ |
struct ospf6_lsa *lsa; |
struct ospf6_lsa *lsa; |
|
|
|
if (lsdb == NULL) |
|
return; |
|
|
for (lsa = ospf6_lsdb_head (lsdb); lsa; lsa = ospf6_lsdb_next (lsa)) |
for (lsa = ospf6_lsdb_head (lsdb); lsa; lsa = ospf6_lsdb_next (lsa)) |
ospf6_lsdb_remove (lsa, lsdb); |
ospf6_lsdb_remove (lsa, lsdb); |
} |
} |
|
|
void |
void |
ospf6_lsdb_show (struct vty *vty, int level, | ospf6_lsdb_lsa_unlock (struct ospf6_lsa *lsa) |
| { |
| if (lsa != NULL) |
| { |
| if (lsa->rn != NULL) |
| route_unlock_node (lsa->rn); |
| ospf6_lsa_unlock (lsa); |
| } |
| } |
| |
| int |
| ospf6_lsdb_maxage_remover (struct ospf6_lsdb *lsdb) |
| { |
| int reschedule = 0; |
| struct ospf6_lsa *lsa; |
| |
| for (lsa = ospf6_lsdb_head (lsdb); lsa; lsa = ospf6_lsdb_next (lsa)) |
| { |
| if (! OSPF6_LSA_IS_MAXAGE (lsa)) |
| continue; |
| if (lsa->retrans_count != 0) |
| { |
| reschedule = 1; |
| continue; |
| } |
| if (IS_OSPF6_DEBUG_LSA_TYPE (lsa->header->type)) |
| zlog_debug ("Remove MaxAge %s", lsa->name); |
| if (CHECK_FLAG(lsa->flag, OSPF6_LSA_SEQWRAPPED)) |
| { |
| UNSET_FLAG(lsa->flag, OSPF6_LSA_SEQWRAPPED); |
| /* |
| * lsa->header->age = 0; |
| */ |
| lsa->header->seqnum = htonl(OSPF_MAX_SEQUENCE_NUMBER + 1); |
| ospf6_lsa_checksum (lsa->header); |
| |
| THREAD_OFF(lsa->refresh); |
| thread_execute (master, ospf6_lsa_refresh, lsa, 0); |
| } else { |
| ospf6_lsdb_remove (lsa, lsdb); |
| } |
| } |
| |
| return (reschedule); |
| } |
| |
| void |
| ospf6_lsdb_show (struct vty *vty, enum ospf_lsdb_show_level level, |
u_int16_t *type, u_int32_t *id, u_int32_t *adv_router, |
u_int16_t *type, u_int32_t *id, u_int32_t *adv_router, |
struct ospf6_lsdb *lsdb) |
struct ospf6_lsdb *lsdb) |
{ |
{ |
struct ospf6_lsa *lsa; |
struct ospf6_lsa *lsa; |
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL; |
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL; |
|
|
if (level == OSPF6_LSDB_SHOW_LEVEL_NORMAL) | switch (level) |
showfunc = ospf6_lsa_show_summary; | { |
else if (level == OSPF6_LSDB_SHOW_LEVEL_DETAIL) | case OSPF6_LSDB_SHOW_LEVEL_DETAIL: |
showfunc = ospf6_lsa_show; | showfunc = ospf6_lsa_show; |
else if (level == OSPF6_LSDB_SHOW_LEVEL_INTERNAL) | break; |
showfunc = ospf6_lsa_show_internal; | case OSPF6_LSDB_SHOW_LEVEL_INTERNAL: |
else if (level == OSPF6_LSDB_SHOW_LEVEL_DUMP) | showfunc = ospf6_lsa_show_internal; |
showfunc = ospf6_lsa_show_dump; | break; |
| case OSPF6_LSDB_SHOW_LEVEL_DUMP: |
| showfunc = ospf6_lsa_show_dump; |
| break; |
| case OSPF6_LSDB_SHOW_LEVEL_NORMAL: |
| default: |
| showfunc = ospf6_lsa_show_summary; |
| } |
| |
if (type && id && adv_router) |
if (type && id && adv_router) |
{ |
{ |
lsa = ospf6_lsdb_lookup (*type, *id, *adv_router, lsdb); |
lsa = ospf6_lsdb_lookup (*type, *id, *adv_router, lsdb); |
Line 551 ospf6_new_ls_id (u_int16_t type, u_int32_t adv_router,
|
Line 561 ospf6_new_ls_id (u_int16_t type, u_int32_t adv_router,
|
continue; |
continue; |
if (ntohl (lsa->header->id) > id) |
if (ntohl (lsa->header->id) > id) |
{ |
{ |
ospf6_lsa_unlock (lsa); | ospf6_lsdb_lsa_unlock (lsa); |
break; |
break; |
} |
} |
id++; |
id++; |
Line 572 ospf6_new_ls_seqnum (u_int16_t type, u_int32_t id, u_i
|
Line 582 ospf6_new_ls_seqnum (u_int16_t type, u_int32_t id, u_i
|
/* if current database copy not found, return InitialSequenceNumber */ |
/* if current database copy not found, return InitialSequenceNumber */ |
lsa = ospf6_lsdb_lookup (type, id, adv_router, lsdb); |
lsa = ospf6_lsdb_lookup (type, id, adv_router, lsdb); |
if (lsa == NULL) |
if (lsa == NULL) |
seqnum = INITIAL_SEQUENCE_NUMBER; | seqnum = OSPF_INITIAL_SEQUENCE_NUMBER; |
else |
else |
seqnum = (signed long) ntohl (lsa->header->seqnum) + 1; |
seqnum = (signed long) ntohl (lsa->header->seqnum) + 1; |
|
|