diff options
| author | Josh Bailey <joshb@google.com> | 2012-03-24 08:35:20 -0700 | 
|---|---|---|
| committer | Avneesh Sachdev <avneesh@opensourcerouting.org> | 2012-04-07 13:54:37 -0700 | 
| commit | 3f045a08812525505e165deea99a79447b44506b (patch) | |
| tree | a5c944b0584e0e5a14908a2ac9476637e7c1d7e6 /isisd/isis_csm.c | |
| parent | 6902c69aa30a73ecd70ef8941518b541ca02b878 (diff) | |
isisd: add Google's changes to IS-IS
Diffstat (limited to 'isisd/isis_csm.c')
| -rw-r--r-- | isisd/isis_csm.c | 36 | 
1 files changed, 26 insertions, 10 deletions
diff --git a/isisd/isis_csm.c b/isisd/isis_csm.c index 80d0c90663..5d74a71be9 100644 --- a/isisd/isis_csm.c +++ b/isisd/isis_csm.c @@ -36,6 +36,7 @@  #include "isisd/include-netbsd/iso.h"  #include "isisd/isis_constants.h"  #include "isisd/isis_common.h" +#include "isisd/isis_flags.h"  #include "isisd/isis_circuit.h"  #include "isisd/isis_tlv.h"  #include "isisd/isis_lsp.h" @@ -45,7 +46,6 @@  #include "isisd/isis_constants.h"  #include "isisd/isis_adjacency.h"  #include "isisd/isis_dr.h" -#include "isisd/isis_flags.h"  #include "isisd/isisd.h"  #include "isisd/isis_csm.h"  #include "isisd/isis_events.h" @@ -85,6 +85,7 @@ isis_csm_state_change (int event, struct isis_circuit *circuit, void *arg)      case C_STATE_NA:        if (circuit)  	zlog_warn ("Non-null circuit while state C_STATE_NA"); +      assert (circuit == NULL);        switch (event)  	{  	case ISIS_ENABLE: @@ -106,23 +107,29 @@ isis_csm_state_change (int event, struct isis_circuit *circuit, void *arg)  	}        break;      case C_STATE_INIT: +      assert (circuit);        switch (event)  	{  	case ISIS_ENABLE:  	  isis_circuit_configure (circuit, (struct isis_area *) arg); -	  isis_circuit_up (circuit); +	  if (isis_circuit_up (circuit) != ISIS_OK) +	    { +	      isis_circuit_deconfigure (circuit, (struct isis_area *) arg); +	      break; +	    }  	  circuit->state = C_STATE_UP; -	  isis_event_circuit_state_change (circuit, 1); +	  isis_event_circuit_state_change (circuit, circuit->area, 1);  	  listnode_delete (isis->init_circ_list, circuit);  	  break;  	case IF_UP_FROM_Z: +          assert (circuit);  	  zlog_warn ("circuit already connected");  	  break;  	case ISIS_DISABLE:  	  zlog_warn ("circuit already disabled");  	  break;  	case IF_DOWN_FROM_Z: -	  isis_circuit_if_del (circuit); +	  isis_circuit_if_del (circuit, (struct interface *) arg);  	  listnode_delete (isis->init_circ_list, circuit);  	  isis_circuit_del (circuit);  	  circuit = NULL; @@ -130,6 +137,7 @@ isis_csm_state_change (int event, struct isis_circuit *circuit, void *arg)  	}        break;      case C_STATE_CONF: +      assert (circuit);        switch (event)  	{  	case ISIS_ENABLE: @@ -137,9 +145,13 @@ isis_csm_state_change (int event, struct isis_circuit *circuit, void *arg)  	  break;  	case IF_UP_FROM_Z:  	  isis_circuit_if_add (circuit, (struct interface *) arg); -	  isis_circuit_up (circuit); +	  if (isis_circuit_up (circuit) != ISIS_OK) +            { +              isis_circuit_if_del (circuit, (struct interface *) arg); +	      break; +            }  	  circuit->state = C_STATE_UP; -	  isis_event_circuit_state_change (circuit, 1); +	  isis_event_circuit_state_change (circuit, circuit->area, 1);  	  break;  	case ISIS_DISABLE:  	  isis_circuit_deconfigure (circuit, (struct isis_area *) arg); @@ -152,6 +164,7 @@ isis_csm_state_change (int event, struct isis_circuit *circuit, void *arg)  	}        break;      case C_STATE_UP: +      assert (circuit);        switch (event)  	{  	case ISIS_ENABLE: @@ -161,15 +174,18 @@ isis_csm_state_change (int event, struct isis_circuit *circuit, void *arg)  	  zlog_warn ("circuit already connected");  	  break;  	case ISIS_DISABLE: +	  isis_circuit_down (circuit);  	  isis_circuit_deconfigure (circuit, (struct isis_area *) arg); -	  listnode_add (isis->init_circ_list, circuit);  	  circuit->state = C_STATE_INIT; -	  isis_event_circuit_state_change (circuit, 0); +	  isis_event_circuit_state_change (circuit, +                                           (struct isis_area *)arg, 0); +	  listnode_add (isis->init_circ_list, circuit);  	  break;  	case IF_DOWN_FROM_Z: -	  isis_circuit_if_del (circuit); +	  isis_circuit_down (circuit); +          isis_circuit_if_del (circuit, (struct interface *) arg);  	  circuit->state = C_STATE_CONF; -	  isis_event_circuit_state_change (circuit, 0); +	  isis_event_circuit_state_change (circuit, circuit->area, 0);  	  break;  	}        break;  | 
