mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-04 02:46:34 +00:00
[ospfd] Bug #234. Fix nbr_self reinitialisation after down/up.
2006-01-10 Len Sorensen <lennartsorensen@ruggedcom.com> * (general) Bug #234, see also [quagga-dev 3902]. Fix problem with nbr_self not being properly reinitialised when an interface comes up, after having been down. Some re-arrangement done by Paul Jakma, any bugs introduced on top of Len's suggested changes are his. * ospf_neighbor.c: (ospf_nbr_add_self) centralise initialisation of nbr_self parameters here. * ospf_interface.c: (ospf_if_new) deleting initialisation of parameters of nbr_self, just rely on call to ospf_nbr_add_self. (ospf_if_cleanup) ditto. * ospfd.c: (ospf_network_run) ditto.
This commit is contained in:
parent
818e56cf27
commit
1a643f88b2
@ -3,6 +3,8 @@
|
||||
* (general) Bug #234, see also [quagga-dev 3902].
|
||||
Fix problem with nbr_self not being properly reinitialised
|
||||
when an interface comes up, after having been down.
|
||||
Some re-arrangement done by Paul Jakma, any bugs introduced
|
||||
on top of Len's suggested changes are his.
|
||||
* ospf_neighbor.c: (ospf_nbr_add_self) centralise
|
||||
initialisation of nbr_self parameters here.
|
||||
* ospf_interface.c: (ospf_if_new) deleting initialisation of
|
||||
|
@ -237,9 +237,6 @@ ospf_if_new (struct ospf *ospf, struct interface *ifp, struct prefix *p)
|
||||
|
||||
/* Add pseudo neighbor. */
|
||||
oi->nbr_self = ospf_nbr_new (oi);
|
||||
oi->nbr_self->state = NSM_TwoWay;
|
||||
oi->nbr_self->priority = OSPF_IF_PARAM (oi, priority);
|
||||
oi->nbr_self->options = OSPF_OPTION_E;
|
||||
|
||||
oi->ls_upd_queue = route_table_init ();
|
||||
oi->t_ls_upd_event = NULL;
|
||||
@ -267,7 +264,7 @@ ospf_if_cleanup (struct ospf_interface *oi)
|
||||
struct ospf_nbr_nbma *nbr_nbma;
|
||||
struct ospf_lsa *lsa;
|
||||
|
||||
/* oi->nbrs and oi->nbr_nbma should be deletete on InterafceDown event */
|
||||
/* oi->nbrs and oi->nbr_nbma should be deleted on InterfaceDown event */
|
||||
/* delete all static neighbors attached to this interface */
|
||||
for (ALL_LIST_ELEMENTS (oi->nbr_nbma, node, nnode, nbr_nbma))
|
||||
{
|
||||
@ -300,26 +297,11 @@ ospf_if_cleanup (struct ospf_interface *oi)
|
||||
/* Empty link state update queue */
|
||||
ospf_ls_upd_queue_empty (oi);
|
||||
|
||||
/* Handle pseudo neighbor. */
|
||||
/* Reset pseudo neighbor. */
|
||||
ospf_nbr_delete (oi->nbr_self);
|
||||
oi->nbr_self = ospf_nbr_new (oi);
|
||||
oi->nbr_self->state = NSM_TwoWay;
|
||||
oi->nbr_self->priority = OSPF_IF_PARAM (oi, priority);
|
||||
|
||||
switch (oi->area->external_routing)
|
||||
{
|
||||
case OSPF_AREA_DEFAULT:
|
||||
SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
|
||||
break;
|
||||
case OSPF_AREA_STUB:
|
||||
UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
|
||||
break;
|
||||
case OSPF_AREA_NSSA:
|
||||
UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
|
||||
SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
|
||||
break;
|
||||
}
|
||||
|
||||
ospf_nbr_add_self (oi);
|
||||
|
||||
ospf_lsa_unlock (oi->network_lsa_self);
|
||||
oi->network_lsa_self = NULL;
|
||||
OSPF_TIMER_OFF (oi->t_network_lsa_self);
|
||||
|
@ -202,6 +202,27 @@ ospf_nbr_add_self (struct ospf_interface *oi)
|
||||
}
|
||||
else
|
||||
rn->info = oi->nbr_self;
|
||||
|
||||
/* Initial state */
|
||||
oi->nbr_self->address = *oi->address;
|
||||
oi->nbr_self->priority = OSPF_IF_PARAM (oi, priority);
|
||||
oi->nbr_self->router_id = oi->ospf->router_id;
|
||||
oi->nbr_self->src = oi->address->u.prefix4;
|
||||
oi->nbr_self->state = NSM_TwoWay;
|
||||
|
||||
switch (oi->area->external_routing)
|
||||
{
|
||||
case OSPF_AREA_DEFAULT:
|
||||
SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
|
||||
break;
|
||||
case OSPF_AREA_STUB:
|
||||
UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
|
||||
break;
|
||||
case OSPF_AREA_NSSA:
|
||||
UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
|
||||
SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get neighbor count by status.
|
||||
|
@ -859,24 +859,14 @@ ospf_network_run (struct ospf *ospf, struct prefix *p, struct ospf_area *area)
|
||||
oi = ospf_if_new (ospf, ifp, co->address);
|
||||
oi->connected = co;
|
||||
|
||||
oi->nbr_self->address = *oi->address;
|
||||
|
||||
oi->area = area;
|
||||
|
||||
oi->params = ospf_lookup_if_params (ifp, oi->address->u.prefix4);
|
||||
oi->output_cost = ospf_if_get_output_cost (oi);
|
||||
|
||||
if (area->external_routing != OSPF_AREA_DEFAULT)
|
||||
UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
|
||||
oi->nbr_self->priority = OSPF_IF_PARAM (oi, priority);
|
||||
|
||||
/* Add pseudo neighbor. */
|
||||
ospf_nbr_add_self (oi);
|
||||
|
||||
/* Make sure pseudo neighbor's router_id. */
|
||||
oi->nbr_self->router_id = ospf->router_id;
|
||||
oi->nbr_self->src = oi->address->u.prefix4;
|
||||
|
||||
/* Relate ospf interface to ospf instance. */
|
||||
oi->ospf = ospf;
|
||||
|
||||
@ -885,21 +875,6 @@ ospf_network_run (struct ospf *ospf, struct prefix *p, struct ospf_area *area)
|
||||
skip network type setting. */
|
||||
oi->type = IF_DEF_PARAMS (ifp)->type;
|
||||
|
||||
/* Set area flag. */
|
||||
switch (area->external_routing)
|
||||
{
|
||||
case OSPF_AREA_DEFAULT:
|
||||
SET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
|
||||
break;
|
||||
case OSPF_AREA_STUB:
|
||||
UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
|
||||
break;
|
||||
case OSPF_AREA_NSSA:
|
||||
UNSET_FLAG (oi->nbr_self->options, OSPF_OPTION_E);
|
||||
SET_FLAG (oi->nbr_self->options, OSPF_OPTION_NP);
|
||||
break;
|
||||
}
|
||||
|
||||
ospf_area_add_if (oi->area, oi);
|
||||
|
||||
/* if router_id is not configured, dont bring up
|
||||
|
Loading…
Reference in New Issue
Block a user