[ospfd] Clear adjacency state for NSM changes down to TwoWay/ExStart

2006-07-02 Paul Jakma <paul.jakma@sun.com>

	* ospf_nsm.c: (nsm_clear_adj) clear adjacency related state for a
	  neighbour, needed for some state changes from > ExStart down
	  to ExStart or less, which need not go through nsm_reset_nbr.
	  (nsm_reset_nbr) move code to former. Should be static.
	  (ospf_nsm_event) Remove long dead code.
	  Use nsm_clear_adj for state changes that take down
	  adjacencies to TwoWay/ExStart.
	  (nsm_kill_nbr) Oops, action function shouldn't try return
	  1 for error.
This commit is contained in:
Paul Jakma 2006-07-04 13:50:44 +00:00
parent e55dd53bca
commit d1b1cd8fb9
2 changed files with 36 additions and 15 deletions

View File

@ -3,14 +3,23 @@
* ospf_nsm.c: (nsm_should_adj) New function, just consolidate the * ospf_nsm.c: (nsm_should_adj) New function, just consolidate the
10.4 adjacency check from nsm_twoway_received/nsm_adj_ok. 10.4 adjacency check from nsm_twoway_received/nsm_adj_ok.
(nsm_twoway_received/nsm_adj_ok) Use former. (nsm_twoway_received/nsm_adj_ok) Use former.
(nsm_clear_adj) clear adjacency related state for a
neighbour, needed for some state changes from > ExStart down
to ExStart or less, which need not go through nsm_reset_nbr.
(nsm_reset_nbr) move code to former. Should be static.
(ospf_nsm_event) Don't allow action functions to change (ospf_nsm_event) Don't allow action functions to change
next_state if the NSM tables do not indicate next_state is next_state if the NSM tables do not indicate next_state is
conditional, log warning if one tries - existing code conditional, log warning if one tries - existing code
appears fine though. appears fine though.
Remove long dead code.
Use nsm_clear_adj for state changes that take down
adjacencies to TwoWay/ExStart.
(nsm_timer_set) ls_req timer should be OFF in early states. (nsm_timer_set) ls_req timer should be OFF in early states.
Compact several identical sections. Compact several identical sections.
Set inactivity timer to OFF for Down, for documentary Set inactivity timer to OFF for Down, for documentary
purposes. purposes.
(nsm_kill_nbr) Oops, action function shouldn't try return
1 for error.
2006-06-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu> 2006-06-30 Andrew J. Schorr <ajschorr@alumni.princeton.edu>

View File

@ -49,8 +49,8 @@
#include "ospfd/ospf_abr.h" #include "ospfd/ospf_abr.h"
#include "ospfd/ospf_snmp.h" #include "ospfd/ospf_snmp.h"
void nsm_reset_nbr (struct ospf_neighbor *); static void nsm_reset_nbr (struct ospf_neighbor *);
static void nsm_clear_adj (struct ospf_neighbor *);
/* OSPF NSM Timer functions. */ /* OSPF NSM Timer functions. */
static int static int
@ -397,8 +397,12 @@ nsm_oneway_received (struct ospf_neighbor *nbr)
return 0; return 0;
} }
void /* Clear adjacency related state for a neighbour, intended where nbr
nsm_reset_nbr (struct ospf_neighbor *nbr) * transitions from > ExStart (i.e. a Full or forming adjacency)
* to <= ExStart.
*/
static void
nsm_clear_adj (struct ospf_neighbor *nbr)
{ {
/* Clear Database Summary list. */ /* Clear Database Summary list. */
if (!ospf_db_summary_isempty (nbr)) if (!ospf_db_summary_isempty (nbr))
@ -411,6 +415,12 @@ nsm_reset_nbr (struct ospf_neighbor *nbr)
/* Clear Link State Retransmission list. */ /* Clear Link State Retransmission list. */
if (!ospf_ls_retransmit_isempty (nbr)) if (!ospf_ls_retransmit_isempty (nbr))
ospf_ls_retransmit_clear (nbr); ospf_ls_retransmit_clear (nbr);
}
static void
nsm_reset_nbr (struct ospf_neighbor *nbr)
{
nsm_clear_adj (nbr);
/* Cancel thread. */ /* Cancel thread. */
OSPF_NSM_TIMER_OFF (nbr->t_db_desc); OSPF_NSM_TIMER_OFF (nbr->t_db_desc);
@ -433,7 +443,7 @@ nsm_kill_nbr (struct ospf_neighbor *nbr)
/* killing nbr_self is invalid */ /* killing nbr_self is invalid */
assert (nbr != nbr->oi->nbr_self); assert (nbr != nbr->oi->nbr_self);
if (nbr == nbr->oi->nbr_self) if (nbr == nbr->oi->nbr_self)
return 1; return 0;
/* Reset neighbor. */ /* Reset neighbor. */
nsm_reset_nbr (nbr); nsm_reset_nbr (nbr);
@ -748,10 +758,6 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
if (vl_area->full_vls > 0) if (vl_area->full_vls > 0)
if (--vl_area->full_vls == 0) if (--vl_area->full_vls == 0)
ospf_schedule_abr_task (oi->ospf); ospf_schedule_abr_task (oi->ospf);
/* clear neighbor retransmit list */
if (!ospf_ls_retransmit_isempty (nbr))
ospf_ls_retransmit_clear (nbr);
} }
zlog_info ("nsm_change_state(%s, %s -> %s): " zlog_info ("nsm_change_state(%s, %s -> %s): "
@ -790,6 +796,18 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
ospf_opaque_nsm_change (nbr, old_state); ospf_opaque_nsm_change (nbr, old_state);
#endif /* HAVE_OPAQUE_LSA */ #endif /* HAVE_OPAQUE_LSA */
/* State changes from > ExStart to <= ExStart should clear any Exchange
* or Full/LSA Update related lists and state.
* Potential causal events: BadLSReq, SeqNumberMismatch, AdjOK?
*
* Note that transitions from > ExStart to < 2-Way (e.g. due to
* KillNbr or 1-Way) must and will do the same, but via
* nsm_reset_nbr.
*/
if (old_state > NSM_ExStart
&& (state == NSM_ExStart || state == NSM_TwoWay))
nsm_clear_adj (nbr);
/* Start DD exchange protocol */ /* Start DD exchange protocol */
if (state == NSM_ExStart) if (state == NSM_ExStart)
{ {
@ -807,11 +825,6 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
nbr->crypt_seqnum = 0; nbr->crypt_seqnum = 0;
/* Generete NeighborChange ISM event. */ /* Generete NeighborChange ISM event. */
#ifdef BUGGY_ISM_TRANSITION
if ((old_state < NSM_TwoWay && state >= NSM_TwoWay) ||
(old_state >= NSM_TwoWay && state < NSM_TwoWay))
OSPF_ISM_EVENT_EXECUTE (oi, ISM_NeighborChange);
#else /* BUGGY_ISM_TRANSITION */
switch (oi->state) { switch (oi->state) {
case ISM_DROther: case ISM_DROther:
case ISM_Backup: case ISM_Backup:
@ -824,7 +837,6 @@ nsm_change_state (struct ospf_neighbor *nbr, int state)
/* ISM_PointToPoint -> ISM_Down, ISM_Loopback -> ISM_Down, etc. */ /* ISM_PointToPoint -> ISM_Down, ISM_Loopback -> ISM_Down, etc. */
break; break;
} }
#endif /* BUGGY_ISM_TRANSITION */
/* Performance hack. Send hello immideately when some neighbor enter /* Performance hack. Send hello immideately when some neighbor enter
Init state. This whay we decrease neighbor discovery time. Gleb.*/ Init state. This whay we decrease neighbor discovery time. Gleb.*/