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>