diff options
Diffstat (limited to 'isisd/isis_csm.c')
| -rw-r--r-- | isisd/isis_csm.c | 310 | 
1 files changed, 153 insertions, 157 deletions
diff --git a/isisd/isis_csm.c b/isisd/isis_csm.c index 90272d68b2..b0ccdee769 100644 --- a/isisd/isis_csm.c +++ b/isisd/isis_csm.c @@ -2,17 +2,17 @@   * IS-IS Rout(e)ing protocol - isis_csm.c   *                             IS-IS circuit state machine   * Copyright (C) 2001,2002    Sampo Saaristo - *                            Tampere University of Technology       + *                            Tampere University of Technology   *                            Institute of Communications Engineering   * - * This program is free software; you can redistribute it and/or modify it  - * under the terms of the GNU General Public Licenseas published by the Free  - * Software Foundation; either version 2 of the License, or (at your option)  + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public Licenseas published by the Free + * Software Foundation; either version 2 of the License, or (at your option)   * any later version.   * - * This program is distributed in the hope that it will be useful,but WITHOUT  - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or  - * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for  + * This program is distributed in the hope that it will be useful,but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for   * more details.   *   * You should have received a copy of the GNU General Public License along @@ -51,169 +51,165 @@  extern struct isis *isis; -static const char *csm_statestr[] = { -  "C_STATE_NA", -  "C_STATE_INIT", -  "C_STATE_CONF", -  "C_STATE_UP" -}; +static const char *csm_statestr[] = {"C_STATE_NA", "C_STATE_INIT", +				     "C_STATE_CONF", "C_STATE_UP"};  #define STATE2STR(S) csm_statestr[S]  static const char *csm_eventstr[] = { -  "NO_STATE", -  "ISIS_ENABLE", -  "IF_UP_FROM_Z", -  "ISIS_DISABLE", -  "IF_DOWN_FROM_Z", +	"NO_STATE",     "ISIS_ENABLE",    "IF_UP_FROM_Z", +	"ISIS_DISABLE", "IF_DOWN_FROM_Z",  };  #define EVENT2STR(E) csm_eventstr[E]  struct isis_circuit * -isis_csm_state_change (int event, struct isis_circuit *circuit, void *arg) +isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)  { -  int old_state; +	int old_state; -  old_state = circuit ? circuit->state : C_STATE_NA; -  if (isis->debugs & DEBUG_EVENTS) -    zlog_debug ("CSM_EVENT: %s", EVENT2STR (event)); +	old_state = circuit ? circuit->state : C_STATE_NA; +	if (isis->debugs & DEBUG_EVENTS) +		zlog_debug("CSM_EVENT: %s", EVENT2STR(event)); -  switch (old_state) -    { -    case C_STATE_NA: -      if (circuit) -	zlog_warn ("Non-null circuit while state C_STATE_NA"); -      assert (circuit == NULL); -      switch (event) -	{ -	case ISIS_ENABLE: -	  circuit = isis_circuit_new (); -	  isis_circuit_configure (circuit, (struct isis_area *) arg); -	  circuit->state = C_STATE_CONF; -	  break; -	case IF_UP_FROM_Z: -	  circuit = isis_circuit_new (); -	  isis_circuit_if_add (circuit, (struct interface *) arg); -	  listnode_add (isis->init_circ_list, circuit); -	  circuit->state = C_STATE_INIT; -	  break; -	case ISIS_DISABLE: -	  zlog_warn ("circuit already disabled"); -	  break; -	case IF_DOWN_FROM_Z: -	  zlog_warn ("circuit already disconnected"); -	  break; -	} -      break; -    case C_STATE_INIT: -      assert (circuit); -      switch (event) -	{ -	case ISIS_ENABLE: -	  isis_circuit_configure (circuit, (struct isis_area *) arg); -	  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, 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, (struct interface *) arg); -	  listnode_delete (isis->init_circ_list, circuit); -	  isis_circuit_del (circuit); -	  circuit = NULL; -	  break; -	} -      break; -    case C_STATE_CONF: -      assert (circuit); -      switch (event) -	{ -	case ISIS_ENABLE: -	  zlog_warn ("circuit already enabled"); -	  break; -	case IF_UP_FROM_Z: -	  isis_circuit_if_add (circuit, (struct interface *) arg); -	  if (isis_circuit_up (circuit) != ISIS_OK) -	    { -	      zlog_err("Could not bring up %s because of invalid config.", -	               circuit->interface->name); -	      zlog_err("Clearing config for %s. Please re-examine it.", -	               circuit->interface->name); -	      if (circuit->ip_router) -	        { -	          circuit->ip_router = 0; -	          circuit->area->ip_circuits--; -	        } -	      if (circuit->ipv6_router) -	        { -	          circuit->ipv6_router = 0; -	          circuit->area->ipv6_circuits--; -	        } -	      circuit_update_nlpids(circuit); -	      isis_circuit_deconfigure(circuit, circuit->area); -	      listnode_add (isis->init_circ_list, circuit); -	      circuit->state = C_STATE_INIT; -	      break; -	    } -	  circuit->state = C_STATE_UP; -	  isis_event_circuit_state_change (circuit, circuit->area, 1); -	  break; -	case ISIS_DISABLE: -	  isis_circuit_deconfigure (circuit, (struct isis_area *) arg); -	  isis_circuit_del (circuit); -	  circuit = NULL; -	  break; -	case IF_DOWN_FROM_Z: -	  zlog_warn ("circuit already disconnected"); -	  break; -	} -      break; -    case C_STATE_UP: -      assert (circuit); -      switch (event) -	{ -	case ISIS_ENABLE: -	  zlog_warn ("circuit already configured"); -	  break; -	case IF_UP_FROM_Z: -	  zlog_warn ("circuit already connected"); -	  break; -	case ISIS_DISABLE: -	  isis_circuit_down (circuit); -	  isis_circuit_deconfigure (circuit, (struct isis_area *) arg); -	  circuit->state = C_STATE_INIT; -	  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_down (circuit); -          isis_circuit_if_del (circuit, (struct interface *) arg); -	  circuit->state = C_STATE_CONF; -	  isis_event_circuit_state_change (circuit, circuit->area, 0); -	  break; -	} -      break; +	switch (old_state) { +	case C_STATE_NA: +		if (circuit) +			zlog_warn("Non-null circuit while state C_STATE_NA"); +		assert(circuit == NULL); +		switch (event) { +		case ISIS_ENABLE: +			circuit = isis_circuit_new(); +			isis_circuit_configure(circuit, +					       (struct isis_area *)arg); +			circuit->state = C_STATE_CONF; +			break; +		case IF_UP_FROM_Z: +			circuit = isis_circuit_new(); +			isis_circuit_if_add(circuit, (struct interface *)arg); +			listnode_add(isis->init_circ_list, circuit); +			circuit->state = C_STATE_INIT; +			break; +		case ISIS_DISABLE: +			zlog_warn("circuit already disabled"); +			break; +		case IF_DOWN_FROM_Z: +			zlog_warn("circuit already disconnected"); +			break; +		} +		break; +	case C_STATE_INIT: +		assert(circuit); +		switch (event) { +		case ISIS_ENABLE: +			isis_circuit_configure(circuit, +					       (struct isis_area *)arg); +			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, 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, (struct interface *)arg); +			listnode_delete(isis->init_circ_list, circuit); +			isis_circuit_del(circuit); +			circuit = NULL; +			break; +		} +		break; +	case C_STATE_CONF: +		assert(circuit); +		switch (event) { +		case ISIS_ENABLE: +			zlog_warn("circuit already enabled"); +			break; +		case IF_UP_FROM_Z: +			isis_circuit_if_add(circuit, (struct interface *)arg); +			if (isis_circuit_up(circuit) != ISIS_OK) { +				zlog_err( +					"Could not bring up %s because of invalid config.", +					circuit->interface->name); +				zlog_err( +					"Clearing config for %s. Please re-examine it.", +					circuit->interface->name); +				if (circuit->ip_router) { +					circuit->ip_router = 0; +					circuit->area->ip_circuits--; +				} +				if (circuit->ipv6_router) { +					circuit->ipv6_router = 0; +					circuit->area->ipv6_circuits--; +				} +				circuit_update_nlpids(circuit); +				isis_circuit_deconfigure(circuit, +							 circuit->area); +				listnode_add(isis->init_circ_list, circuit); +				circuit->state = C_STATE_INIT; +				break; +			} +			circuit->state = C_STATE_UP; +			isis_event_circuit_state_change(circuit, circuit->area, +							1); +			break; +		case ISIS_DISABLE: +			isis_circuit_deconfigure(circuit, +						 (struct isis_area *)arg); +			isis_circuit_del(circuit); +			circuit = NULL; +			break; +		case IF_DOWN_FROM_Z: +			zlog_warn("circuit already disconnected"); +			break; +		} +		break; +	case C_STATE_UP: +		assert(circuit); +		switch (event) { +		case ISIS_ENABLE: +			zlog_warn("circuit already configured"); +			break; +		case IF_UP_FROM_Z: +			zlog_warn("circuit already connected"); +			break; +		case ISIS_DISABLE: +			isis_circuit_down(circuit); +			isis_circuit_deconfigure(circuit, +						 (struct isis_area *)arg); +			circuit->state = C_STATE_INIT; +			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_down(circuit); +			isis_circuit_if_del(circuit, (struct interface *)arg); +			circuit->state = C_STATE_CONF; +			isis_event_circuit_state_change(circuit, circuit->area, +							0); +			break; +		} +		break; -    default: -      zlog_warn ("Invalid circuit state %d", old_state); -    } +	default: +		zlog_warn("Invalid circuit state %d", old_state); +	} -  if (isis->debugs & DEBUG_EVENTS) -    zlog_debug ("CSM_STATE_CHANGE: %s -> %s ", STATE2STR (old_state), -		circuit ? STATE2STR (circuit->state) : STATE2STR (C_STATE_NA)); +	if (isis->debugs & DEBUG_EVENTS) +		zlog_debug("CSM_STATE_CHANGE: %s -> %s ", STATE2STR(old_state), +			   circuit ? STATE2STR(circuit->state) +				   : STATE2STR(C_STATE_NA)); -  return circuit; +	return circuit;  }  | 
