diff options
author | Ondrej Filip <feela@network.cz> | 2000-05-10 14:37:43 +0200 |
---|---|---|
committer | Ondrej Filip <feela@network.cz> | 2000-05-10 14:37:43 +0200 |
commit | c7e46aae66861ce282e9b1a0140fa422763094ce (patch) | |
tree | 2719cf1b4edaae8a3465f1d278a8dd0ffbd4c715 /proto/ospf/neighbor.c | |
parent | 7f5f44bb9248f05f397617f3874feef26bbb0b0b (diff) | |
download | bird-c7e46aae66861ce282e9b1a0140fa422763094ce.tar bird-c7e46aae66861ce282e9b1a0140fa422763094ce.zip |
Destroying of neighbor moved from 'hello' to 'neighbor' and
improved.
Diffstat (limited to 'proto/ospf/neighbor.c')
-rw-r--r-- | proto/ospf/neighbor.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/proto/ospf/neighbor.c b/proto/ospf/neighbor.c index c959ab8..78bba61 100644 --- a/proto/ospf/neighbor.c +++ b/proto/ospf/neighbor.c @@ -427,4 +427,51 @@ ospf_find_area(struct proto_ospf *po, u32 aid) return NULL; } +/* Neighbor is inactive for a long time. Remove it. */ +void +neighbor_timer_hook(timer *timer) +{ + struct ospf_neighbor *n; + struct ospf_iface *ifa; + struct proto *p; + + n=(struct ospf_neighbor *)timer->data; + ifa=n->ifa; + p=(struct proto *)(ifa->proto); + debug("%s: Inactivity timer fired on interface %s for neighbor %I.\n", + p->name, ifa->iface->name, n->rid); + neigh_chstate(n, NEIGHBOR_DOWN); + tm_stop(n->inactim); + rfree(n->inactim); + if(n->rxmt_timer!=NULL) + { + tm_stop(n->rxmt_timer); + rfree(n->rxmt_timer); + } + if(n->lsrr_timer!=NULL) + { + tm_stop(n->lsrr_timer); + rfree(n->lsrr_timer); + } + if(n->ackd_timer!=NULL) + { + tm_stop(n->ackd_timer); + rfree(n->ackd_timer); + } + if(n->ldbdes!=NULL) + { + mb_free(n->ldbdes); + } + if(n->lsrqh!=NULL) + { + ospf_top_free(n->lsrqh); + } + if(n->lsrth!=NULL) + { + ospf_top_free(n->lsrth); + } + rem_node(NODE n); + mb_free(n); + debug("%s: Deleting neigbor.\n", p->name); +} |