Annotation of embedaddon/quagga/isisd/isis_csm.c, revision 1.1.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>