]> git.proxmox.com Git - mirror_frr.git/blob - isisd/isis_vty_isisd.c
isisd: retrofit the 'spf-interval' command
[mirror_frr.git] / isisd / isis_vty_isisd.c
1 /*
2 * IS-IS Rout(e)ing protocol - isis_vty_isisd.c
3 *
4 * This file contains the CLI that is specific to IS-IS
5 *
6 * Copyright (C) 2001,2002 Sampo Saaristo
7 * Tampere University of Technology
8 * Institute of Communications Engineering
9 * Copyright (C) 2016 David Lamparter, for NetDEF, Inc.
10 * Copyright (C) 2018 Christian Franke, for NetDEF, Inc.
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public Licenseas published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 *
17 * This program is distributed in the hope that it will be useful,but WITHOUT
18 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
20 * more details.
21 *
22 * You should have received a copy of the GNU General Public License along
23 * with this program; see the file COPYING; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 */
26
27 #include <zebra.h>
28
29 #include "command.h"
30
31 #include "isis_circuit.h"
32 #include "isis_csm.h"
33 #include "isis_misc.h"
34 #include "isis_mt.h"
35 #include "isisd.h"
36 #include "isis_vty_common.h"
37
38 static int level_for_arg(const char *arg)
39 {
40 if (!strcmp(arg, "level-1"))
41 return IS_LEVEL_1;
42 else
43 return IS_LEVEL_2;
44 }
45
46 DEFUN (isis_circuit_type,
47 isis_circuit_type_cmd,
48 "isis circuit-type <level-1|level-1-2|level-2-only>",
49 "IS-IS routing protocol\n"
50 "Configure circuit type for interface\n"
51 "Level-1 only adjacencies are formed\n"
52 "Level-1-2 adjacencies are formed\n"
53 "Level-2 only adjacencies are formed\n")
54 {
55 int idx_level = 2;
56 int is_type;
57 struct isis_circuit *circuit = isis_circuit_lookup(vty);
58 if (!circuit)
59 return CMD_ERR_NO_MATCH;
60
61 is_type = string2circuit_t(argv[idx_level]->arg);
62 if (!is_type) {
63 vty_out(vty, "Unknown circuit-type \n");
64 return CMD_WARNING_CONFIG_FAILED;
65 }
66
67 if (circuit->state == C_STATE_UP
68 && circuit->area->is_type != IS_LEVEL_1_AND_2
69 && circuit->area->is_type != is_type) {
70 vty_out(vty, "Invalid circuit level for area %s.\n",
71 circuit->area->area_tag);
72 return CMD_WARNING_CONFIG_FAILED;
73 }
74 isis_circuit_is_type_set(circuit, is_type);
75
76 return CMD_SUCCESS;
77 }
78
79 DEFUN (no_isis_circuit_type,
80 no_isis_circuit_type_cmd,
81 "no isis circuit-type <level-1|level-1-2|level-2-only>",
82 NO_STR
83 "IS-IS routing protocol\n"
84 "Configure circuit type for interface\n"
85 "Level-1 only adjacencies are formed\n"
86 "Level-1-2 adjacencies are formed\n"
87 "Level-2 only adjacencies are formed\n")
88 {
89 int is_type;
90 struct isis_circuit *circuit = isis_circuit_lookup(vty);
91 if (!circuit)
92 return CMD_ERR_NO_MATCH;
93
94 /*
95 * Set the circuits level to its default value
96 */
97 if (circuit->state == C_STATE_UP)
98 is_type = circuit->area->is_type;
99 else
100 is_type = IS_LEVEL_1_AND_2;
101 isis_circuit_is_type_set(circuit, is_type);
102
103 return CMD_SUCCESS;
104 }
105
106 DEFUN (isis_network,
107 isis_network_cmd,
108 "isis network point-to-point",
109 "IS-IS routing protocol\n"
110 "Set network type\n"
111 "point-to-point network type\n")
112 {
113 struct isis_circuit *circuit = isis_circuit_lookup(vty);
114 if (!circuit)
115 return CMD_ERR_NO_MATCH;
116
117 if (isis_circuit_circ_type_set(circuit, CIRCUIT_T_P2P)) {
118 vty_out(vty,
119 "isis network point-to-point is valid only on broadcast interfaces\n");
120 return CMD_WARNING_CONFIG_FAILED;
121 }
122
123 return CMD_SUCCESS;
124 }
125
126 DEFUN (no_isis_network,
127 no_isis_network_cmd,
128 "no isis network point-to-point",
129 NO_STR
130 "IS-IS routing protocol\n"
131 "Set network type for circuit\n"
132 "point-to-point network type\n")
133 {
134 struct isis_circuit *circuit = isis_circuit_lookup(vty);
135 if (!circuit)
136 return CMD_ERR_NO_MATCH;
137
138 if (isis_circuit_circ_type_set(circuit, CIRCUIT_T_BROADCAST)) {
139 vty_out(vty,
140 "isis network point-to-point is valid only on broadcast interfaces\n");
141 return CMD_WARNING_CONFIG_FAILED;
142 }
143
144 return CMD_SUCCESS;
145 }
146
147 DEFUN (isis_priority,
148 isis_priority_cmd,
149 "isis priority (0-127)",
150 "IS-IS routing protocol\n"
151 "Set priority for Designated Router election\n"
152 "Priority value\n")
153 {
154 uint8_t prio = atoi(argv[2]->arg);
155 struct isis_circuit *circuit = isis_circuit_lookup(vty);
156 if (!circuit)
157 return CMD_ERR_NO_MATCH;
158
159 circuit->priority[0] = prio;
160 circuit->priority[1] = prio;
161
162 return CMD_SUCCESS;
163 }
164
165 DEFUN (no_isis_priority,
166 no_isis_priority_cmd,
167 "no isis priority [(0-127)]",
168 NO_STR
169 "IS-IS routing protocol\n"
170 "Set priority for Designated Router election\n"
171 "Priority value\n")
172 {
173 struct isis_circuit *circuit = isis_circuit_lookup(vty);
174 if (!circuit)
175 return CMD_ERR_NO_MATCH;
176
177 circuit->priority[0] = DEFAULT_PRIORITY;
178 circuit->priority[1] = DEFAULT_PRIORITY;
179
180 return CMD_SUCCESS;
181 }
182
183 DEFUN (isis_priority_level,
184 isis_priority_level_cmd,
185 "isis priority (0-127) <level-1|level-2>",
186 "IS-IS routing protocol\n"
187 "Set priority for Designated Router election\n"
188 "Priority value\n"
189 "Specify priority for level-1 routing\n"
190 "Specify priority for level-2 routing\n")
191 {
192 uint8_t prio = atoi(argv[2]->arg);
193 struct isis_circuit *circuit = isis_circuit_lookup(vty);
194 if (!circuit)
195 return CMD_ERR_NO_MATCH;
196
197 circuit->priority[level_for_arg(argv[3]->text)] = prio;
198
199 return CMD_SUCCESS;
200 }
201
202 DEFUN (no_isis_priority_level,
203 no_isis_priority_level_cmd,
204 "no isis priority [(0-127)] <level-1|level-2>",
205 NO_STR
206 "IS-IS routing protocol\n"
207 "Set priority for Designated Router election\n"
208 "Priority value\n"
209 "Specify priority for level-1 routing\n"
210 "Specify priority for level-2 routing\n")
211 {
212 struct isis_circuit *circuit = isis_circuit_lookup(vty);
213 int level = level_for_arg(argv[argc - 1]->text);
214 if (!circuit)
215 return CMD_ERR_NO_MATCH;
216
217 circuit->priority[level] = DEFAULT_PRIORITY;
218
219 return CMD_SUCCESS;
220 }
221
222 DEFUN (isis_metric_level,
223 isis_metric_level_cmd,
224 "isis metric (0-16777215) <level-1|level-2>",
225 "IS-IS routing protocol\n"
226 "Set default metric for circuit\n"
227 "Default metric value\n"
228 "Specify metric for level-1 routing\n"
229 "Specify metric for level-2 routing\n")
230 {
231 uint32_t met = atoi(argv[2]->arg);
232 struct isis_circuit *circuit = isis_circuit_lookup(vty);
233 if (!circuit)
234 return CMD_ERR_NO_MATCH;
235
236 CMD_FERR_RETURN(isis_circuit_metric_set(circuit,
237 level_for_arg(argv[3]->text),
238 met),
239 "Failed to set metric: $ERR");
240 return CMD_SUCCESS;
241 }
242
243 DEFUN (no_isis_metric_level,
244 no_isis_metric_level_cmd,
245 "no isis metric [(0-16777215)] <level-1|level-2>",
246 NO_STR
247 "IS-IS routing protocol\n"
248 "Set default metric for circuit\n"
249 "Default metric value\n"
250 "Specify metric for level-1 routing\n"
251 "Specify metric for level-2 routing\n")
252 {
253 struct isis_circuit *circuit = isis_circuit_lookup(vty);
254 int level = level_for_arg(argv[argc - 1]->text);
255 if (!circuit)
256 return CMD_ERR_NO_MATCH;
257
258 CMD_FERR_RETURN(isis_circuit_metric_set(circuit, level,
259 DEFAULT_CIRCUIT_METRIC),
260 "Failed to set L1 metric: $ERR");
261 return CMD_SUCCESS;
262 }
263
264 DEFUN (isis_hello_interval_level,
265 isis_hello_interval_level_cmd,
266 "isis hello-interval (1-600) <level-1|level-2>",
267 "IS-IS routing protocol\n"
268 "Set Hello interval\n"
269 "Holdtime 1 second, interval depends on multiplier\n"
270 "Specify hello-interval for level-1 IIHs\n"
271 "Specify hello-interval for level-2 IIHs\n")
272 {
273 uint32_t interval = atoi(argv[2]->arg);
274 struct isis_circuit *circuit = isis_circuit_lookup(vty);
275 if (!circuit)
276 return CMD_ERR_NO_MATCH;
277
278 circuit->hello_interval[level_for_arg(argv[3]->text)] = interval;
279
280 return CMD_SUCCESS;
281 }
282
283 DEFUN (no_isis_hello_interval_level,
284 no_isis_hello_interval_level_cmd,
285 "no isis hello-interval [(1-600)] <level-1|level-2>",
286 NO_STR
287 "IS-IS routing protocol\n"
288 "Set Hello interval\n"
289 "Holdtime 1 second, interval depends on multiplier\n"
290 "Specify hello-interval for level-1 IIHs\n"
291 "Specify hello-interval for level-2 IIHs\n")
292 {
293 struct isis_circuit *circuit = isis_circuit_lookup(vty);
294 int level = level_for_arg(argv[argc - 1]->text);
295 if (!circuit)
296 return CMD_ERR_NO_MATCH;
297
298 circuit->hello_interval[level] = DEFAULT_HELLO_INTERVAL;
299
300 return CMD_SUCCESS;
301 }
302
303 DEFUN (isis_hello_multiplier_level,
304 isis_hello_multiplier_level_cmd,
305 "isis hello-multiplier (2-100) <level-1|level-2>",
306 "IS-IS routing protocol\n"
307 "Set multiplier for Hello holding time\n"
308 "Hello multiplier value\n"
309 "Specify hello multiplier for level-1 IIHs\n"
310 "Specify hello multiplier for level-2 IIHs\n")
311 {
312 uint16_t mult = atoi(argv[2]->arg);
313 struct isis_circuit *circuit = isis_circuit_lookup(vty);
314 if (!circuit)
315 return CMD_ERR_NO_MATCH;
316
317 circuit->hello_multiplier[level_for_arg(argv[3]->text)] = mult;
318
319 return CMD_SUCCESS;
320 }
321
322 DEFUN (no_isis_hello_multiplier_level,
323 no_isis_hello_multiplier_level_cmd,
324 "no isis hello-multiplier [(2-100)] <level-1|level-2>",
325 NO_STR
326 "IS-IS routing protocol\n"
327 "Set multiplier for Hello holding time\n"
328 "Hello multiplier value\n"
329 "Specify hello multiplier for level-1 IIHs\n"
330 "Specify hello multiplier for level-2 IIHs\n")
331 {
332 struct isis_circuit *circuit = isis_circuit_lookup(vty);
333 int level = level_for_arg(argv[argc - 1]->text);
334 if (!circuit)
335 return CMD_ERR_NO_MATCH;
336
337 circuit->hello_multiplier[level] = DEFAULT_HELLO_MULTIPLIER;
338
339 return CMD_SUCCESS;
340 }
341
342 DEFUN (isis_threeway_adj,
343 isis_threeway_adj_cmd,
344 "[no] isis three-way-handshake",
345 NO_STR
346 "IS-IS commands\n"
347 "Enable/Disable three-way handshake\n")
348 {
349 struct isis_circuit *circuit = isis_circuit_lookup(vty);
350 if (!circuit)
351 return CMD_ERR_NO_MATCH;
352
353 circuit->disable_threeway_adj = !strcmp(argv[0]->text, "no");
354 return CMD_SUCCESS;
355 }
356
357 DEFUN (isis_hello_padding,
358 isis_hello_padding_cmd,
359 "isis hello padding",
360 "IS-IS routing protocol\n"
361 "Add padding to IS-IS hello packets\n"
362 "Pad hello packets\n")
363 {
364 struct isis_circuit *circuit = isis_circuit_lookup(vty);
365 if (!circuit)
366 return CMD_ERR_NO_MATCH;
367
368 circuit->pad_hellos = 1;
369
370 return CMD_SUCCESS;
371 }
372
373 DEFUN (no_isis_hello_padding,
374 no_isis_hello_padding_cmd,
375 "no isis hello padding",
376 NO_STR
377 "IS-IS routing protocol\n"
378 "Add padding to IS-IS hello packets\n"
379 "Pad hello packets\n")
380 {
381 struct isis_circuit *circuit = isis_circuit_lookup(vty);
382 if (!circuit)
383 return CMD_ERR_NO_MATCH;
384
385 circuit->pad_hellos = 0;
386
387 return CMD_SUCCESS;
388 }
389
390 DEFUN (csnp_interval_level,
391 csnp_interval_level_cmd,
392 "isis csnp-interval (1-600) <level-1|level-2>",
393 "IS-IS routing protocol\n"
394 "Set CSNP interval in seconds\n"
395 "CSNP interval value\n"
396 "Specify interval for level-1 CSNPs\n"
397 "Specify interval for level-2 CSNPs\n")
398 {
399 uint16_t interval = atoi(argv[2]->arg);
400 struct isis_circuit *circuit = isis_circuit_lookup(vty);
401 if (!circuit)
402 return CMD_ERR_NO_MATCH;
403
404 circuit->csnp_interval[level_for_arg(argv[3]->text)] = interval;
405
406 return CMD_SUCCESS;
407 }
408
409 DEFUN (no_csnp_interval_level,
410 no_csnp_interval_level_cmd,
411 "no isis csnp-interval [(1-600)] <level-1|level-2>",
412 NO_STR
413 "IS-IS routing protocol\n"
414 "Set CSNP interval in seconds\n"
415 "CSNP interval value\n"
416 "Specify interval for level-1 CSNPs\n"
417 "Specify interval for level-2 CSNPs\n")
418 {
419 struct isis_circuit *circuit = isis_circuit_lookup(vty);
420 int level = level_for_arg(argv[argc - 1]->text);
421 if (!circuit)
422 return CMD_ERR_NO_MATCH;
423
424 circuit->csnp_interval[level] = DEFAULT_CSNP_INTERVAL;
425
426 return CMD_SUCCESS;
427 }
428
429 DEFUN (psnp_interval_level,
430 psnp_interval_level_cmd,
431 "isis psnp-interval (1-120) <level-1|level-2>",
432 "IS-IS routing protocol\n"
433 "Set PSNP interval in seconds\n"
434 "PSNP interval value\n"
435 "Specify interval for level-1 PSNPs\n"
436 "Specify interval for level-2 PSNPs\n")
437 {
438 uint16_t interval = atoi(argv[2]->arg);
439 struct isis_circuit *circuit = isis_circuit_lookup(vty);
440 if (!circuit)
441 return CMD_ERR_NO_MATCH;
442
443 circuit->psnp_interval[level_for_arg(argv[3]->text)] = (uint16_t)interval;
444
445 return CMD_SUCCESS;
446 }
447
448 DEFUN (no_psnp_interval_level,
449 no_psnp_interval_level_cmd,
450 "no isis psnp-interval [(1-120)] <level-1|level-2>",
451 NO_STR
452 "IS-IS routing protocol\n"
453 "Set PSNP interval in seconds\n"
454 "PSNP interval value\n"
455 "Specify interval for level-1 PSNPs\n"
456 "Specify interval for level-2 PSNPs\n")
457 {
458 struct isis_circuit *circuit = isis_circuit_lookup(vty);
459 int level = level_for_arg(argv[argc - 1]->text);
460 if (!circuit)
461 return CMD_ERR_NO_MATCH;
462
463 circuit->psnp_interval[level] = DEFAULT_PSNP_INTERVAL;
464
465 return CMD_SUCCESS;
466 }
467
468 void isis_vty_daemon_init(void)
469 {
470 install_element(INTERFACE_NODE, &isis_circuit_type_cmd);
471 install_element(INTERFACE_NODE, &no_isis_circuit_type_cmd);
472
473 install_element(INTERFACE_NODE, &isis_network_cmd);
474 install_element(INTERFACE_NODE, &no_isis_network_cmd);
475
476 install_element(INTERFACE_NODE, &isis_priority_cmd);
477 install_element(INTERFACE_NODE, &no_isis_priority_cmd);
478 install_element(INTERFACE_NODE, &isis_priority_level_cmd);
479 install_element(INTERFACE_NODE, &no_isis_priority_level_cmd);
480
481 install_element(INTERFACE_NODE, &isis_metric_level_cmd);
482 install_element(INTERFACE_NODE, &no_isis_metric_level_cmd);
483
484 install_element(INTERFACE_NODE, &isis_hello_interval_level_cmd);
485 install_element(INTERFACE_NODE, &no_isis_hello_interval_level_cmd);
486
487 install_element(INTERFACE_NODE, &isis_hello_multiplier_level_cmd);
488 install_element(INTERFACE_NODE, &no_isis_hello_multiplier_level_cmd);
489
490 install_element(INTERFACE_NODE, &isis_threeway_adj_cmd);
491
492 install_element(INTERFACE_NODE, &isis_hello_padding_cmd);
493 install_element(INTERFACE_NODE, &no_isis_hello_padding_cmd);
494
495 install_element(INTERFACE_NODE, &csnp_interval_level_cmd);
496 install_element(INTERFACE_NODE, &no_csnp_interval_level_cmd);
497
498 install_element(INTERFACE_NODE, &psnp_interval_level_cmd);
499 install_element(INTERFACE_NODE, &no_psnp_interval_level_cmd);
500 }