]>
Commit | Line | Data |
---|---|---|
eb5d44eb | 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> | |
eb5d44eb | 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 | ||
1cd80845 | 55 | static const char *csm_statestr[] = { |
eb5d44eb | 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 | ||
1cd80845 | 64 | static const char *csm_eventstr[] = { |
eb5d44eb | 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 | ||
f390d2c7 | 74 | struct isis_circuit * |
75 | isis_csm_state_change (int event, struct isis_circuit *circuit, void *arg) | |
eb5d44eb | 76 | { |
77 | int old_state; | |
78 | ||
79 | old_state = circuit ? circuit->state : C_STATE_NA; | |
c89c05dd | 80 | if (isis->debugs & DEBUG_EVENTS) |
81 | zlog_debug ("CSM_EVENT: %s", EVENT2STR (event)); | |
f390d2c7 | 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 | } | |
eb5d44eb | 107 | break; |
f390d2c7 | 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); | |
4660687a | 128 | circuit = NULL; |
f390d2c7 | 129 | break; |
130 | } | |
eb5d44eb | 131 | break; |
f390d2c7 | 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); | |
4660687a | 147 | circuit = NULL; |
f390d2c7 | 148 | break; |
149 | case IF_DOWN_FROM_Z: | |
150 | zlog_warn ("circuit already disconnected"); | |
151 | break; | |
152 | } | |
eb5d44eb | 153 | break; |
f390d2c7 | 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 | } | |
eb5d44eb | 175 | break; |
f390d2c7 | 176 | |
177 | default: | |
178 | zlog_warn ("Invalid circuit state %d", old_state); | |
eb5d44eb | 179 | } |
f390d2c7 | 180 | |
c89c05dd | 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)); | |
eb5d44eb | 184 | |
185 | return circuit; | |
186 | } |