Annotation of embedaddon/quagga/isisd/isis_csm.c, revision 1.1
1.1 ! misho 1: /*
! 2: * IS-IS Rout(e)ing protocol - isis_csm.c
! 3: * IS-IS circuit state machine
! 4: * Copyright (C) 2001,2002 Sampo Saaristo
! 5: * Tampere University of Technology
! 6: * Institute of Communications Engineering
! 7: *
! 8: * This program is free software; you can redistribute it and/or modify it
! 9: * under the terms of the GNU General Public Licenseas published by the Free
! 10: * Software Foundation; either version 2 of the License, or (at your option)
! 11: * any later version.
! 12: *
! 13: * This program is distributed in the hope that it will be useful,but WITHOUT
! 14: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
! 15: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
! 16: * more details.
! 17: *
! 18: * You should have received a copy of the GNU General Public License along
! 19: * with this program; if not, write to the Free Software Foundation, Inc.,
! 20: * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
! 21: */
! 22:
! 23: #include <zebra.h>
! 24:
! 25: #include "log.h"
! 26: #include "memory.h"
! 27: #include "if.h"
! 28: #include "linklist.h"
! 29: #include "command.h"
! 30: #include "thread.h"
! 31: #include "hash.h"
! 32: #include "prefix.h"
! 33: #include "stream.h"
! 34:
! 35: #include "isisd/dict.h"
! 36: #include "isisd/include-netbsd/iso.h"
! 37: #include "isisd/isis_constants.h"
! 38: #include "isisd/isis_common.h"
! 39: #include "isisd/isis_circuit.h"
! 40: #include "isisd/isis_tlv.h"
! 41: #include "isisd/isis_lsp.h"
! 42: #include "isisd/isis_pdu.h"
! 43: #include "isisd/isis_network.h"
! 44: #include "isisd/isis_misc.h"
! 45: #include "isisd/isis_constants.h"
! 46: #include "isisd/isis_adjacency.h"
! 47: #include "isisd/isis_dr.h"
! 48: #include "isisd/isis_flags.h"
! 49: #include "isisd/isisd.h"
! 50: #include "isisd/isis_csm.h"
! 51: #include "isisd/isis_events.h"
! 52:
! 53: extern struct isis *isis;
! 54:
! 55: static const char *csm_statestr[] = {
! 56: "C_STATE_NA",
! 57: "C_STATE_INIT",
! 58: "C_STATE_CONF",
! 59: "C_STATE_UP"
! 60: };
! 61:
! 62: #define STATE2STR(S) csm_statestr[S]
! 63:
! 64: static const char *csm_eventstr[] = {
! 65: "NO_STATE",
! 66: "ISIS_ENABLE",
! 67: "IF_UP_FROM_Z",
! 68: "ISIS_DISABLE",
! 69: "IF_DOWN_FROM_Z",
! 70: };
! 71:
! 72: #define EVENT2STR(E) csm_eventstr[E]
! 73:
! 74: struct isis_circuit *
! 75: isis_csm_state_change (int event, struct isis_circuit *circuit, void *arg)
! 76: {
! 77: int old_state;
! 78:
! 79: old_state = circuit ? circuit->state : C_STATE_NA;
! 80: if (isis->debugs & DEBUG_EVENTS)
! 81: zlog_debug ("CSM_EVENT: %s", EVENT2STR (event));
! 82:
! 83: switch (old_state)
! 84: {
! 85: case C_STATE_NA:
! 86: if (circuit)
! 87: zlog_warn ("Non-null circuit while state C_STATE_NA");
! 88: switch (event)
! 89: {
! 90: case ISIS_ENABLE:
! 91: circuit = isis_circuit_new ();
! 92: isis_circuit_configure (circuit, (struct isis_area *) arg);
! 93: circuit->state = C_STATE_CONF;
! 94: break;
! 95: case IF_UP_FROM_Z:
! 96: circuit = isis_circuit_new ();
! 97: isis_circuit_if_add (circuit, (struct interface *) arg);
! 98: listnode_add (isis->init_circ_list, circuit);
! 99: circuit->state = C_STATE_INIT;
! 100: break;
! 101: case ISIS_DISABLE:
! 102: zlog_warn ("circuit already disabled");
! 103: case IF_DOWN_FROM_Z:
! 104: zlog_warn ("circuit already disconnected");
! 105: break;
! 106: }
! 107: break;
! 108: case C_STATE_INIT:
! 109: switch (event)
! 110: {
! 111: case ISIS_ENABLE:
! 112: isis_circuit_configure (circuit, (struct isis_area *) arg);
! 113: isis_circuit_up (circuit);
! 114: circuit->state = C_STATE_UP;
! 115: isis_event_circuit_state_change (circuit, 1);
! 116: listnode_delete (isis->init_circ_list, circuit);
! 117: break;
! 118: case IF_UP_FROM_Z:
! 119: zlog_warn ("circuit already connected");
! 120: break;
! 121: case ISIS_DISABLE:
! 122: zlog_warn ("circuit already disabled");
! 123: break;
! 124: case IF_DOWN_FROM_Z:
! 125: isis_circuit_if_del (circuit);
! 126: listnode_delete (isis->init_circ_list, circuit);
! 127: isis_circuit_del (circuit);
! 128: circuit = NULL;
! 129: break;
! 130: }
! 131: break;
! 132: case C_STATE_CONF:
! 133: switch (event)
! 134: {
! 135: case ISIS_ENABLE:
! 136: zlog_warn ("circuit already enabled");
! 137: break;
! 138: case IF_UP_FROM_Z:
! 139: isis_circuit_if_add (circuit, (struct interface *) arg);
! 140: isis_circuit_up (circuit);
! 141: circuit->state = C_STATE_UP;
! 142: isis_event_circuit_state_change (circuit, 1);
! 143: break;
! 144: case ISIS_DISABLE:
! 145: isis_circuit_deconfigure (circuit, (struct isis_area *) arg);
! 146: isis_circuit_del (circuit);
! 147: circuit = NULL;
! 148: break;
! 149: case IF_DOWN_FROM_Z:
! 150: zlog_warn ("circuit already disconnected");
! 151: break;
! 152: }
! 153: break;
! 154: case C_STATE_UP:
! 155: switch (event)
! 156: {
! 157: case ISIS_ENABLE:
! 158: zlog_warn ("circuit already configured");
! 159: break;
! 160: case IF_UP_FROM_Z:
! 161: zlog_warn ("circuit already connected");
! 162: break;
! 163: case ISIS_DISABLE:
! 164: isis_circuit_deconfigure (circuit, (struct isis_area *) arg);
! 165: listnode_add (isis->init_circ_list, circuit);
! 166: circuit->state = C_STATE_INIT;
! 167: isis_event_circuit_state_change (circuit, 0);
! 168: break;
! 169: case IF_DOWN_FROM_Z:
! 170: isis_circuit_if_del (circuit);
! 171: circuit->state = C_STATE_CONF;
! 172: isis_event_circuit_state_change (circuit, 0);
! 173: break;
! 174: }
! 175: break;
! 176:
! 177: default:
! 178: zlog_warn ("Invalid circuit state %d", old_state);
! 179: }
! 180:
! 181: if (isis->debugs & DEBUG_EVENTS)
! 182: zlog_debug ("CSM_STATE_CHANGE: %s -> %s ", STATE2STR (old_state),
! 183: circuit ? STATE2STR (circuit->state) : STATE2STR (C_STATE_NA));
! 184:
! 185: return circuit;
! 186: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>