1: /*
2: * IS-IS Rout(e)ing protocol - isis_events.h
3: *
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: #include <zebra.h>
23:
24: #include "log.h"
25: #include "memory.h"
26: #include "if.h"
27: #include "linklist.h"
28: #include "command.h"
29: #include "thread.h"
30: #include "hash.h"
31: #include "prefix.h"
32: #include "stream.h"
33:
34: #include "isisd/dict.h"
35: #include "isisd/include-netbsd/iso.h"
36: #include "isisd/isis_constants.h"
37: #include "isisd/isis_common.h"
38: #include "isisd/isis_circuit.h"
39: #include "isisd/isis_tlv.h"
40: #include "isisd/isis_lsp.h"
41: #include "isisd/isis_pdu.h"
42: #include "isisd/isis_network.h"
43: #include "isisd/isis_misc.h"
44: #include "isisd/isis_constants.h"
45: #include "isisd/isis_adjacency.h"
46: #include "isisd/isis_dr.h"
47: #include "isisd/isis_flags.h"
48: #include "isisd/isisd.h"
49: #include "isisd/isis_csm.h"
50: #include "isisd/isis_events.h"
51: #include "isisd/isis_spf.h"
52:
53: extern struct thread_master *master;
54: extern struct isis *isis;
55:
56: /* debug isis-spf spf-events
57: 4w4d: ISIS-Spf (tlt): L2 SPF needed, new adjacency, from 0x609229F4
58: 4w4d: ISIS-Spf (tlt): L2, 0000.0000.0042.01-00 TLV contents changed, code 0x2
59: 4w4d: ISIS-Spf (tlt): L2, new LSP 0 DEAD.BEEF.0043.00-00
60: 4w5d: ISIS-Spf (tlt): L1 SPF needed, periodic SPF, from 0x6091C844
61: 4w5d: ISIS-Spf (tlt): L2 SPF needed, periodic SPF, from 0x6091C844
62: */
63:
64: void
65: isis_event_circuit_state_change (struct isis_circuit *circuit, int up)
66: {
67: struct isis_area *area;
68:
69: area = circuit->area;
70: assert (area);
71: area->circuit_state_changes++;
72:
73: if (isis->debugs & DEBUG_EVENTS)
74: zlog_debug ("ISIS-Evt (%s) circuit %s", circuit->area->area_tag,
75: up ? "up" : "down");
76:
77: /*
78: * Regenerate LSPs this affects
79: */
80: lsp_regenerate_schedule (area);
81:
82: return;
83: }
84:
85: void
86: isis_event_system_type_change (struct isis_area *area, int newtype)
87: {
88: struct listnode *node;
89: struct isis_circuit *circuit;
90:
91: if (isis->debugs & DEBUG_EVENTS)
92: zlog_debug ("ISIS-Evt (%s) system type change %s -> %s", area->area_tag,
93: circuit_t2string (area->is_type), circuit_t2string (newtype));
94:
95: if (area->is_type == newtype)
96: return; /* No change */
97:
98: switch (area->is_type)
99: {
100: case IS_LEVEL_1:
101: if (area->lspdb[1] == NULL)
102: area->lspdb[1] = lsp_db_init ();
103: lsp_l2_generate (area);
104: break;
105: case IS_LEVEL_1_AND_2:
106: if (newtype == IS_LEVEL_1)
107: {
108: lsp_db_destroy (area->lspdb[1]);
109: }
110: else
111: {
112: lsp_db_destroy (area->lspdb[0]);
113: }
114: break;
115: case IS_LEVEL_2:
116: if (area->lspdb[0] == NULL)
117: area->lspdb[0] = lsp_db_init ();
118: lsp_l1_generate (area);
119: break;
120: default:
121: break;
122: }
123:
124: area->is_type = newtype;
125: for (ALL_LIST_ELEMENTS_RO (area->circuit_list, node, circuit))
126: isis_event_circuit_type_change (circuit, newtype);
127:
128: spftree_area_init (area);
129: lsp_regenerate_schedule (area);
130:
131: return;
132: }
133:
134: void
135: isis_event_area_addr_change (struct isis_area *area)
136: {
137:
138: }
139:
140: static void
141: circuit_commence_level (struct isis_circuit *circuit, int level)
142: {
143: if (level == 1)
144: {
145: THREAD_TIMER_ON (master, circuit->t_send_psnp[0], send_l1_psnp, circuit,
146: isis_jitter (circuit->psnp_interval[0], PSNP_JITTER));
147:
148: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
149: {
150: THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[0], isis_run_dr_l1,
151: circuit, 2 * circuit->hello_interval[1]);
152:
153: THREAD_TIMER_ON (master, circuit->u.bc.t_send_lan_hello[0],
154: send_lan_l1_hello, circuit,
155: isis_jitter (circuit->hello_interval[0],
156: IIH_JITTER));
157:
158: circuit->u.bc.lan_neighs[0] = list_new ();
159: }
160: }
161: else
162: {
163: THREAD_TIMER_ON (master, circuit->t_send_psnp[1], send_l2_psnp, circuit,
164: isis_jitter (circuit->psnp_interval[1], PSNP_JITTER));
165:
166: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
167: {
168: THREAD_TIMER_ON (master, circuit->u.bc.t_run_dr[1], isis_run_dr_l2,
169: circuit, 2 * circuit->hello_interval[1]);
170:
171: THREAD_TIMER_ON (master, circuit->u.bc.t_send_lan_hello[1],
172: send_lan_l2_hello, circuit,
173: isis_jitter (circuit->hello_interval[1],
174: IIH_JITTER));
175:
176: circuit->u.bc.lan_neighs[1] = list_new ();
177: }
178: }
179:
180: return;
181: }
182:
183: static void
184: circuit_resign_level (struct isis_circuit *circuit, int level)
185: {
186: int idx = level - 1;
187:
188: THREAD_TIMER_OFF (circuit->t_send_csnp[idx]);
189: THREAD_TIMER_OFF (circuit->t_send_psnp[idx]);
190:
191: if (circuit->circ_type == CIRCUIT_T_BROADCAST)
192: {
193: THREAD_TIMER_OFF (circuit->u.bc.t_send_lan_hello[idx]);
194: THREAD_TIMER_OFF (circuit->u.bc.t_run_dr[idx]);
195: THREAD_TIMER_OFF (circuit->u.bc.t_refresh_pseudo_lsp[idx]);
196: circuit->u.bc.run_dr_elect[idx] = 0;
197: }
198:
199: return;
200: }
201:
202: void
203: isis_event_circuit_type_change (struct isis_circuit *circuit, int newtype)
204: {
205:
206: if (isis->debugs & DEBUG_EVENTS)
207: zlog_debug ("ISIS-Evt (%s) circuit type change %s -> %s",
208: circuit->area->area_tag,
209: circuit_t2string (circuit->circuit_is_type),
210: circuit_t2string (newtype));
211:
212: if (circuit->circuit_is_type == newtype)
213: return; /* No change */
214:
215: if (!(newtype & circuit->area->is_type))
216: {
217: zlog_err ("ISIS-Evt (%s) circuit type change - invalid level %s because"
218: " area is %s", circuit->area->area_tag,
219: circuit_t2string (newtype),
220: circuit_t2string (circuit->area->is_type));
221: return;
222: }
223:
224: switch (circuit->circuit_is_type)
225: {
226: case IS_LEVEL_1:
227: if (newtype == IS_LEVEL_2)
228: circuit_resign_level (circuit, 1);
229: circuit_commence_level (circuit, 2);
230: break;
231: case IS_LEVEL_1_AND_2:
232: if (newtype == IS_LEVEL_1)
233: circuit_resign_level (circuit, 2);
234: else
235: circuit_resign_level (circuit, 1);
236: break;
237: case IS_LEVEL_2:
238: if (newtype == IS_LEVEL_1)
239: circuit_resign_level (circuit, 2);
240: circuit_commence_level (circuit, 1);
241: break;
242: default:
243: break;
244: }
245:
246: circuit->circuit_is_type = newtype;
247: lsp_regenerate_schedule (circuit->area);
248:
249: return;
250: }
251:
252: /* 04/18/2002 by Gwak. */
253: /**************************************************************************
254: *
255: * EVENTS for LSP generation
256: *
257: * 1) an Adajacency or Circuit Up/Down event
258: * 2) a chnage in Circuit metric
259: * 3) a change in Reachable Address metric
260: * 4) a change in manualAreaAddresses
261: * 5) a change in systemID
262: * 6) a change in DIS status
263: * 7) a chnage in the waiting status
264: *
265: * ***********************************************************************
266: *
267: * current support event
268: *
269: * 1) Adjacency Up/Down event
270: * 6) a change in DIS status
271: *
272: * ***********************************************************************/
273:
274: void
275: isis_event_adjacency_state_change (struct isis_adjacency *adj, int newstate)
276: {
277: /* adjacency state change event.
278: * - the only proto-type was supported */
279:
280: /* invalid arguments */
281: if (!adj || !adj->circuit || !adj->circuit->area)
282: return;
283:
284: if (isis->debugs & DEBUG_EVENTS)
285: zlog_debug ("ISIS-Evt (%s) Adjacency State change",
286: adj->circuit->area->area_tag);
287:
288: /* LSP generation again */
289: lsp_regenerate_schedule (adj->circuit->area);
290:
291: return;
292: }
293:
294: /* events supporting code */
295:
296: int
297: isis_event_dis_status_change (struct thread *thread)
298: {
299: struct isis_circuit *circuit;
300:
301: circuit = THREAD_ARG (thread);
302:
303: /* invalid arguments */
304: if (!circuit || !circuit->area)
305: return 0;
306: if (isis->debugs & DEBUG_EVENTS)
307: zlog_debug ("ISIS-Evt (%s) DIS status change", circuit->area->area_tag);
308:
309: /* LSP generation again */
310: lsp_regenerate_schedule (circuit->area);
311:
312: return 0;
313: }
314:
315: void
316: isis_event_auth_failure (char *area_tag, const char *error_string, u_char *sysid)
317: {
318: if (isis->debugs & DEBUG_EVENTS)
319: zlog_debug ("ISIS-Evt (%s) Authentication failure %s from %s",
320: area_tag, error_string, sysid_print (sysid));
321:
322: return;
323: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>