diff options
| author | Fritz Reichmann <fritz@reichmann.nl> | 2011-09-14 19:31:51 +0400 | 
|---|---|---|
| committer | Denis Ovsienko <infrastation@yandex.ru> | 2011-09-25 18:15:40 +0400 | 
| commit | d0d29979d05ddc532475b595b32041412de523c7 (patch) | |
| tree | 7203eb73e84841b6d2569c0325cd4b9d86988dfc /isisd/isisd.c | |
| parent | 158dd4d00ecb0af0d1a77fdc7d4844fc88a0f10f (diff) | |
isisd: fix crash on "no router isis" (BZ#536)
The crash is due to threads accessing data that gets destroyed
during the removal of the configuration.
* isis_circuit.c: Destroy adjacencies to stop adjacency expiry thread.
  Stop PSNP threads.
* isisd.c: Change state of circuit back to INIT and reassign the
  circuit structure to isis->init_circ_list rather than destroying
  the circuit data structure. Stop SPF threads. Stop LSP generation
  threads.
* isisd.h: Add pointers to LSP threads into area structure in order to
  stop them in isisd.c
* isis_lsp.c: Store pointer to LSP thread in area structure.
* isis_pdu.c: Stop PDU generation for a circuit with a removed area.
* isis_pfpacket.c: Stop processing received PDUs for a circuit with a
  removed area.
Diffstat (limited to 'isisd/isisd.c')
| -rw-r--r-- | isisd/isisd.c | 13 | 
1 files changed, 12 insertions, 1 deletions
| diff --git a/isisd/isisd.c b/isisd/isisd.c index 1e84a1ce..20a32809 100644 --- a/isisd/isisd.c +++ b/isisd/isisd.c @@ -52,6 +52,7 @@  #include "isisd/isis_route.h"  #include "isisd/isis_zebra.h"  #include "isisd/isis_events.h" +#include "isisd/isis_csm.h"  #ifdef TOPOLOGY_GENERATE  #include "spgrid.h" @@ -217,21 +218,31 @@ isis_area_destroy (struct vty *vty, const char *area_tag)        for (ALL_LIST_ELEMENTS (area->circuit_list, node, nnode, circuit))  	{  	  /* The fact that it's in circuit_list means that it was configured */ +	  isis_csm_state_change (ISIS_DISABLE, circuit, area); +	  isis_circuit_down (circuit);  	  isis_circuit_deconfigure (circuit, area); -	  isis_circuit_del (circuit);  	}        list_delete (area->circuit_list);      }    listnode_delete (isis->area_list, area); +    THREAD_TIMER_OFF (area->t_tick);    if (area->t_remove_aged)      thread_cancel (area->t_remove_aged);    THREAD_TIMER_OFF (area->t_lsp_refresh[0]);    THREAD_TIMER_OFF (area->t_lsp_refresh[1]); +  THREAD_TIMER_OFF (area->spftree[0]->t_spf); +  THREAD_TIMER_OFF (area->spftree[1]->t_spf); + +  THREAD_TIMER_OFF (area->t_lsp_l1_regenerate); +  THREAD_TIMER_OFF (area->t_lsp_l2_regenerate); +    XFREE (MTYPE_ISIS_AREA, area); +  isis->sysid_set=0; +    return CMD_SUCCESS;  } | 
