summaryrefslogtreecommitdiffstats
path: root/isisd
diff options
context:
space:
mode:
authorChristian Franke <nobody@nowhere.ws>2016-07-28 17:23:30 +0200
committerDonald Sharp <sharpd@cumulusnetwroks.com>2016-07-28 17:08:49 +0200
commit466ed4061dcce9a6d5895349fd2d8929258d9527 (patch)
tree6a6bbd66dede14a500ed43ca53f55946782cbd35 /isisd
parentisisd: API: LSP-MTU & area level (diff)
downloadfrr-466ed4061dcce9a6d5895349fd2d8929258d9527.tar.xz
frr-466ed4061dcce9a6d5895349fd2d8929258d9527.zip
isisd: API: timers (LSP, SPF)
See previous commits... Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Diffstat (limited to 'isisd')
-rw-r--r--isisd/isis_circuit.c24
-rw-r--r--isisd/isis_vty.c565
-rw-r--r--isisd/isisd.c643
-rw-r--r--isisd/isisd.h4
4 files changed, 585 insertions, 651 deletions
diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c
index f53c08cfc..cac1065d4 100644
--- a/isisd/isis_circuit.c
+++ b/isisd/isis_circuit.c
@@ -196,30 +196,6 @@ circuit_scan_by_ifp (struct interface *ifp)
return circuit_lookup_by_ifp (ifp, isis->init_circ_list);
}
-static struct isis_circuit *
-isis_circuit_lookup (struct vty *vty)
-{
- struct interface *ifp;
- struct isis_circuit *circuit;
-
- ifp = (struct interface *) vty->index;
- if (!ifp)
- {
- vty_out (vty, "Invalid interface %s", VTY_NEWLINE);
- return NULL;
- }
-
- circuit = circuit_scan_by_ifp (ifp);
- if (!circuit)
- {
- vty_out (vty, "ISIS is not enabled on circuit %s%s",
- ifp->name, VTY_NEWLINE);
- return NULL;
- }
-
- return circuit;
-}
-
void
isis_circuit_add_addr (struct isis_circuit *circuit,
struct connected *connected)
diff --git a/isisd/isis_vty.c b/isisd/isis_vty.c
index ef910df9f..be4150430 100644
--- a/isisd/isis_vty.c
+++ b/isisd/isis_vty.c
@@ -1640,6 +1640,531 @@ DEFUN (no_is_type,
return CMD_SUCCESS;
}
+static int
+set_lsp_gen_interval (struct vty *vty, struct isis_area *area,
+ uint16_t interval, int level)
+{
+ int lvl;
+
+ for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
+ {
+ if (!(lvl & level))
+ continue;
+
+ if (interval >= area->lsp_refresh[lvl-1])
+ {
+ vty_out (vty, "LSP gen interval %us must be less than "
+ "the LSP refresh interval %us%s",
+ interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
+ return CMD_ERR_AMBIGUOUS;
+ }
+ }
+
+ for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
+ {
+ if (!(lvl & level))
+ continue;
+ area->lsp_gen_interval[lvl-1] = interval;
+ }
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (lsp_gen_interval,
+ lsp_gen_interval_cmd,
+ "lsp-gen-interval <1-120>",
+ "Minimum interval between regenerating same LSP\n"
+ "Minimum interval in seconds\n")
+{
+ struct isis_area *area;
+ uint16_t interval;
+ int level;
+
+ area = vty->index;
+ interval = atoi (argv[0]);
+ level = IS_LEVEL_1 | IS_LEVEL_2;
+ return set_lsp_gen_interval (vty, area, interval, level);
+}
+
+DEFUN (no_lsp_gen_interval,
+ no_lsp_gen_interval_cmd,
+ "no lsp-gen-interval",
+ NO_STR
+ "Minimum interval between regenerating same LSP\n")
+{
+ struct isis_area *area;
+ uint16_t interval;
+ int level;
+
+ area = vty->index;
+ interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
+ level = IS_LEVEL_1 | IS_LEVEL_2;
+ return set_lsp_gen_interval (vty, area, interval, level);
+}
+
+ALIAS (no_lsp_gen_interval,
+ no_lsp_gen_interval_arg_cmd,
+ "no lsp-gen-interval <1-120>",
+ NO_STR
+ "Minimum interval between regenerating same LSP\n"
+ "Minimum interval in seconds\n")
+
+DEFUN (lsp_gen_interval_l1,
+ lsp_gen_interval_l1_cmd,
+ "lsp-gen-interval level-1 <1-120>",
+ "Minimum interval between regenerating same LSP\n"
+ "Set interval for level 1 only\n"
+ "Minimum interval in seconds\n")
+{
+ struct isis_area *area;
+ uint16_t interval;
+ int level;
+
+ area = vty->index;
+ interval = atoi (argv[0]);
+ level = IS_LEVEL_1;
+ return set_lsp_gen_interval (vty, area, interval, level);
+}
+
+DEFUN (no_lsp_gen_interval_l1,
+ no_lsp_gen_interval_l1_cmd,
+ "no lsp-gen-interval level-1",
+ NO_STR
+ "Minimum interval between regenerating same LSP\n"
+ "Set interval for level 1 only\n")
+{
+ struct isis_area *area;
+ uint16_t interval;
+ int level;
+
+ area = vty->index;
+ interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
+ level = IS_LEVEL_1;
+ return set_lsp_gen_interval (vty, area, interval, level);
+}
+
+ALIAS (no_lsp_gen_interval_l1,
+ no_lsp_gen_interval_l1_arg_cmd,
+ "no lsp-gen-interval level-1 <1-120>",
+ NO_STR
+ "Minimum interval between regenerating same LSP\n"
+ "Set interval for level 1 only\n"
+ "Minimum interval in seconds\n")
+
+DEFUN (lsp_gen_interval_l2,
+ lsp_gen_interval_l2_cmd,
+ "lsp-gen-interval level-2 <1-120>",
+ "Minimum interval between regenerating same LSP\n"
+ "Set interval for level 2 only\n"
+ "Minimum interval in seconds\n")
+{
+ struct isis_area *area;
+ uint16_t interval;
+ int level;
+
+ area = vty->index;
+ interval = atoi (argv[0]);
+ level = IS_LEVEL_2;
+ return set_lsp_gen_interval (vty, area, interval, level);
+}
+
+DEFUN (no_lsp_gen_interval_l2,
+ no_lsp_gen_interval_l2_cmd,
+ "no lsp-gen-interval level-2",
+ NO_STR
+ "Minimum interval between regenerating same LSP\n"
+ "Set interval for level 2 only\n")
+{
+ struct isis_area *area;
+ uint16_t interval;
+ int level;
+
+ area = vty->index;
+ interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
+ level = IS_LEVEL_2;
+ return set_lsp_gen_interval (vty, area, interval, level);
+}
+
+ALIAS (no_lsp_gen_interval_l2,
+ no_lsp_gen_interval_l2_arg_cmd,
+ "no lsp-gen-interval level-2 <1-120>",
+ NO_STR
+ "Minimum interval between regenerating same LSP\n"
+ "Set interval for level 2 only\n"
+ "Minimum interval in seconds\n")
+
+DEFUN (spf_interval,
+ spf_interval_cmd,
+ "spf-interval <1-120>",
+ "Minimum interval between SPF calculations\n"
+ "Minimum interval between consecutive SPFs in seconds\n")
+{
+ struct isis_area *area;
+ u_int16_t interval;
+
+ area = vty->index;
+ interval = atoi (argv[0]);
+ area->min_spf_interval[0] = interval;
+ area->min_spf_interval[1] = interval;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_spf_interval,
+ no_spf_interval_cmd,
+ "no spf-interval",
+ NO_STR
+ "Minimum interval between SPF calculations\n")
+{
+ struct isis_area *area;
+
+ area = vty->index;
+
+ area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
+ area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_spf_interval,
+ no_spf_interval_arg_cmd,
+ "no spf-interval <1-120>",
+ NO_STR
+ "Minimum interval between SPF calculations\n"
+ "Minimum interval between consecutive SPFs in seconds\n")
+
+DEFUN (spf_interval_l1,
+ spf_interval_l1_cmd,
+ "spf-interval level-1 <1-120>",
+ "Minimum interval between SPF calculations\n"
+ "Set interval for level 1 only\n"
+ "Minimum interval between consecutive SPFs in seconds\n")
+{
+ struct isis_area *area;
+ u_int16_t interval;
+
+ area = vty->index;
+ interval = atoi (argv[0]);
+ area->min_spf_interval[0] = interval;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_spf_interval_l1,
+ no_spf_interval_l1_cmd,
+ "no spf-interval level-1",
+ NO_STR
+ "Minimum interval between SPF calculations\n"
+ "Set interval for level 1 only\n")
+{
+ struct isis_area *area;
+
+ area = vty->index;
+
+ area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_spf_interval,
+ no_spf_interval_l1_arg_cmd,
+ "no spf-interval level-1 <1-120>",
+ NO_STR
+ "Minimum interval between SPF calculations\n"
+ "Set interval for level 1 only\n"
+ "Minimum interval between consecutive SPFs in seconds\n")
+
+DEFUN (spf_interval_l2,
+ spf_interval_l2_cmd,
+ "spf-interval level-2 <1-120>",
+ "Minimum interval between SPF calculations\n"
+ "Set interval for level 2 only\n"
+ "Minimum interval between consecutive SPFs in seconds\n")
+{
+ struct isis_area *area;
+ u_int16_t interval;
+
+ area = vty->index;
+ interval = atoi (argv[0]);
+ area->min_spf_interval[1] = interval;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_spf_interval_l2,
+ no_spf_interval_l2_cmd,
+ "no spf-interval level-2",
+ NO_STR
+ "Minimum interval between SPF calculations\n"
+ "Set interval for level 2 only\n")
+{
+ struct isis_area *area;
+
+ area = vty->index;
+
+ area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_spf_interval,
+ no_spf_interval_l2_arg_cmd,
+ "no spf-interval level-2 <1-120>",
+ NO_STR
+ "Minimum interval between SPF calculations\n"
+ "Set interval for level 2 only\n"
+ "Minimum interval between consecutive SPFs in seconds\n")
+
+static int
+area_max_lsp_lifetime_set(struct vty *vty, int level,
+ uint16_t interval)
+{
+ struct isis_area *area = vty->index;
+ int lvl;
+ uint16_t refresh_interval = interval - 300;
+ int set_refresh_interval[ISIS_LEVELS] = {0, 0};
+
+ if (!area)
+ {
+ vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
+ return CMD_ERR_NO_MATCH;
+ }
+
+ for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
+ {
+ if (!(lvl & level))
+ continue;
+
+ if (refresh_interval < area->lsp_refresh[lvl-1])
+ {
+ vty_out (vty, "Level %d Max LSP lifetime %us must be 300s greater than "
+ "the configured LSP refresh interval %us%s",
+ lvl, interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
+ vty_out (vty, "Automatically reducing level %d LSP refresh interval "
+ "to %us%s", lvl, refresh_interval, VTY_NEWLINE);
+ set_refresh_interval[lvl-1] = 1;
+
+ if (refresh_interval <= area->lsp_gen_interval[lvl-1])
+ {
+ vty_out (vty, "LSP refresh interval %us must be greater than "
+ "the configured LSP gen interval %us%s",
+ refresh_interval, area->lsp_gen_interval[lvl-1],
+ VTY_NEWLINE);
+ return CMD_ERR_AMBIGUOUS;
+ }
+ }
+ }
+
+ for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
+ {
+ if (!(lvl & level))
+ continue;
+ isis_area_max_lsp_lifetime_set(area, lvl, interval);
+ if (set_refresh_interval[lvl-1])
+ isis_area_lsp_refresh_set(area, lvl, refresh_interval);
+ }
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (max_lsp_lifetime,
+ max_lsp_lifetime_cmd,
+ "max-lsp-lifetime <350-65535>",
+ "Maximum LSP lifetime\n"
+ "LSP lifetime in seconds\n")
+{
+ return area_max_lsp_lifetime_set(vty, IS_LEVEL_1_AND_2, atoi(argv[0]));
+}
+
+DEFUN (no_max_lsp_lifetime,
+ no_max_lsp_lifetime_cmd,
+ "no max-lsp-lifetime",
+ NO_STR
+ "LSP lifetime in seconds\n")
+{
+ return area_max_lsp_lifetime_set(vty, IS_LEVEL_1_AND_2,
+ DEFAULT_LSP_LIFETIME);
+}
+
+ALIAS (no_max_lsp_lifetime,
+ no_max_lsp_lifetime_arg_cmd,
+ "no max-lsp-lifetime <350-65535>",
+ NO_STR
+ "Maximum LSP lifetime\n"
+ "LSP lifetime in seconds\n")
+
+DEFUN (max_lsp_lifetime_l1,
+ max_lsp_lifetime_l1_cmd,
+ "max-lsp-lifetime level-1 <350-65535>",
+ "Maximum LSP lifetime for Level 1 only\n"
+ "LSP lifetime for Level 1 only in seconds\n")
+{
+ return area_max_lsp_lifetime_set(vty, IS_LEVEL_1, atoi(argv[0]));
+}
+
+DEFUN (no_max_lsp_lifetime_l1,
+ no_max_lsp_lifetime_l1_cmd,
+ "no max-lsp-lifetime level-1",
+ NO_STR
+ "LSP lifetime for Level 1 only in seconds\n")
+{
+ return area_max_lsp_lifetime_set(vty, IS_LEVEL_1, DEFAULT_LSP_LIFETIME);
+}
+
+ALIAS (no_max_lsp_lifetime_l1,
+ no_max_lsp_lifetime_l1_arg_cmd,
+ "no max-lsp-lifetime level-1 <350-65535>",
+ NO_STR
+ "Maximum LSP lifetime for Level 1 only\n"
+ "LSP lifetime for Level 1 only in seconds\n")
+
+DEFUN (max_lsp_lifetime_l2,
+ max_lsp_lifetime_l2_cmd,
+ "max-lsp-lifetime level-2 <350-65535>",
+ "Maximum LSP lifetime for Level 2 only\n"
+ "LSP lifetime for Level 2 only in seconds\n")
+{
+ return area_max_lsp_lifetime_set(vty, IS_LEVEL_2, atoi(argv[0]));
+}
+
+DEFUN (no_max_lsp_lifetime_l2,
+ no_max_lsp_lifetime_l2_cmd,
+ "no max-lsp-lifetime level-2",
+ NO_STR
+ "LSP lifetime for Level 2 only in seconds\n")
+{
+ return area_max_lsp_lifetime_set(vty, IS_LEVEL_2, DEFAULT_LSP_LIFETIME);
+}
+
+ALIAS (no_max_lsp_lifetime_l2,
+ no_max_lsp_lifetime_l2_arg_cmd,
+ "no max-lsp-lifetime level-2 <350-65535>",
+ NO_STR
+ "Maximum LSP lifetime for Level 2 only\n"
+ "LSP lifetime for Level 2 only in seconds\n")
+
+static int
+area_lsp_refresh_interval_set(struct vty *vty, int level, uint16_t interval)
+{
+ struct isis_area *area = vty->index;
+ int lvl;
+
+ if (!area)
+ {
+ vty_out (vty, "Can't find ISIS instance %s", VTY_NEWLINE);
+ return CMD_ERR_NO_MATCH;
+ }
+
+ for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
+ {
+ if (!(lvl & level))
+ continue;
+ if (interval <= area->lsp_gen_interval[lvl-1])
+ {
+ vty_out (vty, "LSP refresh interval %us must be greater than "
+ "the configured LSP gen interval %us%s",
+ interval, area->lsp_gen_interval[lvl-1],
+ VTY_NEWLINE);
+ return CMD_ERR_AMBIGUOUS;
+ }
+ if (interval > (area->max_lsp_lifetime[lvl-1] - 300))
+ {
+ vty_out (vty, "LSP refresh interval %us must be less than "
+ "the configured LSP lifetime %us less 300%s",
+ interval, area->max_lsp_lifetime[lvl-1],
+ VTY_NEWLINE);
+ return CMD_ERR_AMBIGUOUS;
+ }
+ }
+
+ for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
+ {
+ if (!(lvl & level))
+ continue;
+ isis_area_lsp_refresh_set(area, lvl, interval);
+ }
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (lsp_refresh_interval,
+ lsp_refresh_interval_cmd,
+ "lsp-refresh-interval <1-65235>",
+ "LSP refresh interval\n"
+ "LSP refresh interval in seconds\n")
+{
+ return area_lsp_refresh_interval_set(vty, IS_LEVEL_1_AND_2, atoi(argv[0]));
+}
+
+DEFUN (no_lsp_refresh_interval,
+ no_lsp_refresh_interval_cmd,
+ "no lsp-refresh-interval",
+ NO_STR
+ "LSP refresh interval in seconds\n")
+{
+ return area_lsp_refresh_interval_set(vty, IS_LEVEL_1_AND_2,
+ DEFAULT_MAX_LSP_GEN_INTERVAL);
+}
+
+ALIAS (no_lsp_refresh_interval,
+ no_lsp_refresh_interval_arg_cmd,
+ "no lsp-refresh-interval <1-65235>",
+ NO_STR
+ "LSP refresh interval\n"
+ "LSP refresh interval in seconds\n")
+
+DEFUN (lsp_refresh_interval_l1,
+ lsp_refresh_interval_l1_cmd,
+ "lsp-refresh-interval level-1 <1-65235>",
+ "LSP refresh interval for Level 1 only\n"
+ "LSP refresh interval for Level 1 only in seconds\n")
+{
+ return area_lsp_refresh_interval_set(vty, IS_LEVEL_1, atoi(argv[0]));
+}
+
+DEFUN (no_lsp_refresh_interval_l1,
+ no_lsp_refresh_interval_l1_cmd,
+ "no lsp-refresh-interval level-1",
+ NO_STR
+ "LSP refresh interval for Level 1 only in seconds\n")
+{
+ return area_lsp_refresh_interval_set(vty, IS_LEVEL_1,
+ DEFAULT_MAX_LSP_GEN_INTERVAL);
+}
+
+ALIAS (no_lsp_refresh_interval_l1,
+ no_lsp_refresh_interval_l1_arg_cmd,
+ "no lsp-refresh-interval level-1 <1-65235>",
+ NO_STR
+ "LSP refresh interval for Level 1 only\n"
+ "LSP refresh interval for Level 1 only in seconds\n")
+
+DEFUN (lsp_refresh_interval_l2,
+ lsp_refresh_interval_l2_cmd,
+ "lsp-refresh-interval level-2 <1-65235>",
+ "LSP refresh interval for Level 2 only\n"
+ "LSP refresh interval for Level 2 only in seconds\n")
+{
+ return area_lsp_refresh_interval_set(vty, IS_LEVEL_2, atoi(argv[0]));
+}
+
+DEFUN (no_lsp_refresh_interval_l2,
+ no_lsp_refresh_interval_l2_cmd,
+ "no lsp-refresh-interval level-2",
+ NO_STR
+ "LSP refresh interval for Level 2 only in seconds\n")
+{
+ return area_lsp_refresh_interval_set(vty, IS_LEVEL_2,
+ DEFAULT_MAX_LSP_GEN_INTERVAL);
+}
+
+ALIAS (no_lsp_refresh_interval_l2,
+ no_lsp_refresh_interval_l2_arg_cmd,
+ "no lsp-refresh-interval level-2 <1-65235>",
+ NO_STR
+ "LSP refresh interval for Level 2 only\n"
+ "LSP refresh interval for Level 2 only in seconds\n")
+
void
isis_vty_init (void)
{
@@ -1740,4 +2265,44 @@ isis_vty_init (void)
install_element (ISIS_NODE, &is_type_cmd);
install_element (ISIS_NODE, &no_is_type_cmd);
+
+ install_element (ISIS_NODE, &lsp_gen_interval_cmd);
+ install_element (ISIS_NODE, &no_lsp_gen_interval_cmd);
+ install_element (ISIS_NODE, &no_lsp_gen_interval_arg_cmd);
+ install_element (ISIS_NODE, &lsp_gen_interval_l1_cmd);
+ install_element (ISIS_NODE, &no_lsp_gen_interval_l1_cmd);
+ install_element (ISIS_NODE, &no_lsp_gen_interval_l1_arg_cmd);
+ install_element (ISIS_NODE, &lsp_gen_interval_l2_cmd);
+ install_element (ISIS_NODE, &no_lsp_gen_interval_l2_cmd);
+ install_element (ISIS_NODE, &no_lsp_gen_interval_l2_arg_cmd);
+
+ install_element (ISIS_NODE, &spf_interval_cmd);
+ install_element (ISIS_NODE, &no_spf_interval_cmd);
+ install_element (ISIS_NODE, &no_spf_interval_arg_cmd);
+ install_element (ISIS_NODE, &spf_interval_l1_cmd);
+ install_element (ISIS_NODE, &no_spf_interval_l1_cmd);
+ install_element (ISIS_NODE, &no_spf_interval_l1_arg_cmd);
+ install_element (ISIS_NODE, &spf_interval_l2_cmd);
+ install_element (ISIS_NODE, &no_spf_interval_l2_cmd);
+ install_element (ISIS_NODE, &no_spf_interval_l2_arg_cmd);
+
+ install_element (ISIS_NODE, &max_lsp_lifetime_cmd);
+ install_element (ISIS_NODE, &no_max_lsp_lifetime_cmd);
+ install_element (ISIS_NODE, &no_max_lsp_lifetime_arg_cmd);
+ install_element (ISIS_NODE, &max_lsp_lifetime_l1_cmd);
+ install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_cmd);
+ install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_arg_cmd);
+ install_element (ISIS_NODE, &max_lsp_lifetime_l2_cmd);
+ install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_cmd);
+ install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_arg_cmd);
+
+ install_element (ISIS_NODE, &lsp_refresh_interval_cmd);
+ install_element (ISIS_NODE, &no_lsp_refresh_interval_cmd);
+ install_element (ISIS_NODE, &no_lsp_refresh_interval_arg_cmd);
+ install_element (ISIS_NODE, &lsp_refresh_interval_l1_cmd);
+ install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_cmd);
+ install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_arg_cmd);
+ install_element (ISIS_NODE, &lsp_refresh_interval_l2_cmd);
+ install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_cmd);
+ install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_arg_cmd);
}
diff --git a/isisd/isisd.c b/isisd/isisd.c
index bcb16b8e6..4df38082a 100644
--- a/isisd/isisd.c
+++ b/isisd/isisd.c
@@ -2007,159 +2007,6 @@ isis_area_is_type_set(struct isis_area *area, int is_type)
return;
}
-static int
-set_lsp_gen_interval (struct vty *vty, struct isis_area *area,
- uint16_t interval, int level)
-{
- int lvl;
-
- for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
- {
- if (!(lvl & level))
- continue;
-
- if (interval >= area->lsp_refresh[lvl-1])
- {
- vty_out (vty, "LSP gen interval %us must be less than "
- "the LSP refresh interval %us%s",
- interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
- return CMD_ERR_AMBIGUOUS;
- }
- }
-
- for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
- {
- if (!(lvl & level))
- continue;
- area->lsp_gen_interval[lvl-1] = interval;
- }
-
- return CMD_SUCCESS;
-}
-
-DEFUN (lsp_gen_interval,
- lsp_gen_interval_cmd,
- "lsp-gen-interval <1-120>",
- "Minimum interval between regenerating same LSP\n"
- "Minimum interval in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = atoi (argv[0]);
- level = IS_LEVEL_1 | IS_LEVEL_2;
- return set_lsp_gen_interval (vty, area, interval, level);
-}
-
-DEFUN (no_lsp_gen_interval,
- no_lsp_gen_interval_cmd,
- "no lsp-gen-interval",
- NO_STR
- "Minimum interval between regenerating same LSP\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
- level = IS_LEVEL_1 | IS_LEVEL_2;
- return set_lsp_gen_interval (vty, area, interval, level);
-}
-
-ALIAS (no_lsp_gen_interval,
- no_lsp_gen_interval_arg_cmd,
- "no lsp-gen-interval <1-120>",
- NO_STR
- "Minimum interval between regenerating same LSP\n"
- "Minimum interval in seconds\n")
-
-DEFUN (lsp_gen_interval_l1,
- lsp_gen_interval_l1_cmd,
- "lsp-gen-interval level-1 <1-120>",
- "Minimum interval between regenerating same LSP\n"
- "Set interval for level 1 only\n"
- "Minimum interval in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = atoi (argv[0]);
- level = IS_LEVEL_1;
- return set_lsp_gen_interval (vty, area, interval, level);
-}
-
-DEFUN (no_lsp_gen_interval_l1,
- no_lsp_gen_interval_l1_cmd,
- "no lsp-gen-interval level-1",
- NO_STR
- "Minimum interval between regenerating same LSP\n"
- "Set interval for level 1 only\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
- level = IS_LEVEL_1;
- return set_lsp_gen_interval (vty, area, interval, level);
-}
-
-ALIAS (no_lsp_gen_interval_l1,
- no_lsp_gen_interval_l1_arg_cmd,
- "no lsp-gen-interval level-1 <1-120>",
- NO_STR
- "Minimum interval between regenerating same LSP\n"
- "Set interval for level 1 only\n"
- "Minimum interval in seconds\n")
-
-DEFUN (lsp_gen_interval_l2,
- lsp_gen_interval_l2_cmd,
- "lsp-gen-interval level-2 <1-120>",
- "Minimum interval between regenerating same LSP\n"
- "Set interval for level 2 only\n"
- "Minimum interval in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = atoi (argv[0]);
- level = IS_LEVEL_2;
- return set_lsp_gen_interval (vty, area, interval, level);
-}
-
-DEFUN (no_lsp_gen_interval_l2,
- no_lsp_gen_interval_l2_cmd,
- "no lsp-gen-interval level-2",
- NO_STR
- "Minimum interval between regenerating same LSP\n"
- "Set interval for level 2 only\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = DEFAULT_MIN_LSP_GEN_INTERVAL;
- level = IS_LEVEL_2;
- return set_lsp_gen_interval (vty, area, interval, level);
-}
-
-ALIAS (no_lsp_gen_interval_l2,
- no_lsp_gen_interval_l2_arg_cmd,
- "no lsp-gen-interval level-2 <1-120>",
- NO_STR
- "Minimum interval between regenerating same LSP\n"
- "Set interval for level 2 only\n"
- "Minimum interval in seconds\n")
-
void isis_area_metricstyle_set(struct isis_area *area, bool old_metric,
bool new_metric)
{
@@ -2203,450 +2050,32 @@ void isis_area_dynhostname_set(struct isis_area *area, bool dynhostname)
}
}
-DEFUN (spf_interval,
- spf_interval_cmd,
- "spf-interval <1-120>",
- "Minimum interval between SPF calculations\n"
- "Minimum interval between consecutive SPFs in seconds\n")
-{
- struct isis_area *area;
- u_int16_t interval;
-
- area = vty->index;
- interval = atoi (argv[0]);
- area->min_spf_interval[0] = interval;
- area->min_spf_interval[1] = interval;
-
- return CMD_SUCCESS;
-}
-
-DEFUN (no_spf_interval,
- no_spf_interval_cmd,
- "no spf-interval",
- NO_STR
- "Minimum interval between SPF calculations\n")
-{
- struct isis_area *area;
-
- area = vty->index;
-
- area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
- area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
-
- return CMD_SUCCESS;
-}
-
-ALIAS (no_spf_interval,
- no_spf_interval_arg_cmd,
- "no spf-interval <1-120>",
- NO_STR
- "Minimum interval between SPF calculations\n"
- "Minimum interval between consecutive SPFs in seconds\n")
-
-DEFUN (spf_interval_l1,
- spf_interval_l1_cmd,
- "spf-interval level-1 <1-120>",
- "Minimum interval between SPF calculations\n"
- "Set interval for level 1 only\n"
- "Minimum interval between consecutive SPFs in seconds\n")
-{
- struct isis_area *area;
- u_int16_t interval;
-
- area = vty->index;
- interval = atoi (argv[0]);
- area->min_spf_interval[0] = interval;
-
- return CMD_SUCCESS;
-}
-
-DEFUN (no_spf_interval_l1,
- no_spf_interval_l1_cmd,
- "no spf-interval level-1",
- NO_STR
- "Minimum interval between SPF calculations\n"
- "Set interval for level 1 only\n")
-{
- struct isis_area *area;
-
- area = vty->index;
-
- area->min_spf_interval[0] = MINIMUM_SPF_INTERVAL;
-
- return CMD_SUCCESS;
-}
-
-ALIAS (no_spf_interval,
- no_spf_interval_l1_arg_cmd,
- "no spf-interval level-1 <1-120>",
- NO_STR
- "Minimum interval between SPF calculations\n"
- "Set interval for level 1 only\n"
- "Minimum interval between consecutive SPFs in seconds\n")
-
-DEFUN (spf_interval_l2,
- spf_interval_l2_cmd,
- "spf-interval level-2 <1-120>",
- "Minimum interval between SPF calculations\n"
- "Set interval for level 2 only\n"
- "Minimum interval between consecutive SPFs in seconds\n")
-{
- struct isis_area *area;
- u_int16_t interval;
-
- area = vty->index;
- interval = atoi (argv[0]);
- area->min_spf_interval[1] = interval;
-
- return CMD_SUCCESS;
-}
-
-DEFUN (no_spf_interval_l2,
- no_spf_interval_l2_cmd,
- "no spf-interval level-2",
- NO_STR
- "Minimum interval between SPF calculations\n"
- "Set interval for level 2 only\n")
-{
- struct isis_area *area;
-
- area = vty->index;
-
- area->min_spf_interval[1] = MINIMUM_SPF_INTERVAL;
-
- return CMD_SUCCESS;
-}
-
-ALIAS (no_spf_interval,
- no_spf_interval_l2_arg_cmd,
- "no spf-interval level-2 <1-120>",
- NO_STR
- "Minimum interval between SPF calculations\n"
- "Set interval for level 2 only\n"
- "Minimum interval between consecutive SPFs in seconds\n")
-
-static int
-set_lsp_max_lifetime (struct vty *vty, struct isis_area *area,
- uint16_t interval, int level)
-{
- int lvl;
- int set_refresh_interval[ISIS_LEVELS] = {0, 0};
- uint16_t refresh_interval;
-
- refresh_interval = interval - 300;
-
- for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
- {
- if (!(lvl & level))
- continue;
- if (refresh_interval < area->lsp_refresh[lvl-1])
- {
- vty_out (vty, "Level %d Max LSP lifetime %us must be 300s greater than "
- "the configured LSP refresh interval %us%s",
- lvl, interval, area->lsp_refresh[lvl-1], VTY_NEWLINE);
- vty_out (vty, "Automatically reducing level %d LSP refresh interval "
- "to %us%s", lvl, refresh_interval, VTY_NEWLINE);
- set_refresh_interval[lvl-1] = 1;
-
- if (refresh_interval <= area->lsp_gen_interval[lvl-1])
- {
- vty_out (vty, "LSP refresh interval %us must be greater than "
- "the configured LSP gen interval %us%s",
- refresh_interval, area->lsp_gen_interval[lvl-1],
- VTY_NEWLINE);
- return CMD_ERR_AMBIGUOUS;
- }
- }
- }
-
- for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; lvl++)
- {
- if (!(lvl & level))
- continue;
- area->max_lsp_lifetime[lvl-1] = interval;
- /* Automatically reducing lsp_refresh_interval to interval - 300 */
- if (set_refresh_interval[lvl-1])
- area->lsp_refresh[lvl-1] = refresh_interval;
- }
-
- lsp_regenerate_schedule (area, level, 1);
-
- return CMD_SUCCESS;
-}
-
-DEFUN (max_lsp_lifetime,
- max_lsp_lifetime_cmd,
- "max-lsp-lifetime <350-65535>",
- "Maximum LSP lifetime\n"
- "LSP lifetime in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = atoi (argv[0]);
- level = IS_LEVEL_1 | IS_LEVEL_2;
- return set_lsp_max_lifetime (vty, area, interval, level);
-}
-
-DEFUN (no_max_lsp_lifetime,
- no_max_lsp_lifetime_cmd,
- "no max-lsp-lifetime",
- NO_STR
- "LSP lifetime in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = DEFAULT_LSP_LIFETIME;
- level = IS_LEVEL_1 | IS_LEVEL_2;
- return set_lsp_max_lifetime (vty, area, interval, level);
-}
-
-ALIAS (no_max_lsp_lifetime,
- no_max_lsp_lifetime_arg_cmd,
- "no max-lsp-lifetime <350-65535>",
- NO_STR
- "Maximum LSP lifetime\n"
- "LSP lifetime in seconds\n")
-
-DEFUN (max_lsp_lifetime_l1,
- max_lsp_lifetime_l1_cmd,
- "max-lsp-lifetime level-1 <350-65535>",
- "Maximum LSP lifetime for Level 1 only\n"
- "LSP lifetime for Level 1 only in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = atoi (argv[0]);
- level = IS_LEVEL_1;
- return set_lsp_max_lifetime (vty, area, interval, level);
-}
-
-DEFUN (no_max_lsp_lifetime_l1,
- no_max_lsp_lifetime_l1_cmd,
- "no max-lsp-lifetime level-1",
- NO_STR
- "LSP lifetime for Level 1 only in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = DEFAULT_LSP_LIFETIME;
- level = IS_LEVEL_1;
- return set_lsp_max_lifetime (vty, area, interval, level);
-}
-
-ALIAS (no_max_lsp_lifetime_l1,
- no_max_lsp_lifetime_l1_arg_cmd,
- "no max-lsp-lifetime level-1 <350-65535>",
- NO_STR
- "Maximum LSP lifetime for Level 1 only\n"
- "LSP lifetime for Level 1 only in seconds\n")
-
-DEFUN (max_lsp_lifetime_l2,
- max_lsp_lifetime_l2_cmd,
- "max-lsp-lifetime level-2 <350-65535>",
- "Maximum LSP lifetime for Level 2 only\n"
- "LSP lifetime for Level 2 only in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = atoi (argv[0]);
- level = IS_LEVEL_2;
- return set_lsp_max_lifetime (vty, area, interval, level);
-}
-
-DEFUN (no_max_lsp_lifetime_l2,
- no_max_lsp_lifetime_l2_cmd,
- "no max-lsp-lifetime level-2",
- NO_STR
- "LSP lifetime for Level 2 only in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = DEFAULT_LSP_LIFETIME;
- level = IS_LEVEL_2;
- return set_lsp_max_lifetime (vty, area, interval, level);
-}
-
-ALIAS (no_max_lsp_lifetime_l2,
- no_max_lsp_lifetime_l2_arg_cmd,
- "no max-lsp-lifetime level-2 <350-65535>",
- NO_STR
- "Maximum LSP lifetime for Level 2 only\n"
- "LSP lifetime for Level 2 only in seconds\n")
-
-static int
-set_lsp_refresh_interval (struct vty *vty, struct isis_area *area,
- uint16_t interval, int level)
-{
- int lvl;
-
- for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
- {
- if (!(lvl & level))
- continue;
- if (interval <= area->lsp_gen_interval[lvl-1])
- {
- vty_out (vty, "LSP refresh interval %us must be greater than "
- "the configured LSP gen interval %us%s",
- interval, area->lsp_gen_interval[lvl-1],
- VTY_NEWLINE);
- return CMD_ERR_AMBIGUOUS;
- }
- if (interval > (area->max_lsp_lifetime[lvl-1] - 300))
- {
- vty_out (vty, "LSP refresh interval %us must be less than "
- "the configured LSP lifetime %us less 300%s",
- interval, area->max_lsp_lifetime[lvl-1],
- VTY_NEWLINE);
- return CMD_ERR_AMBIGUOUS;
- }
- }
-
- for (lvl = IS_LEVEL_1; lvl <= IS_LEVEL_2; ++lvl)
- {
- if (!(lvl & level))
- continue;
- area->lsp_refresh[lvl-1] = interval;
- }
- lsp_regenerate_schedule (area, level, 1);
-
- return CMD_SUCCESS;
-}
-
-DEFUN (lsp_refresh_interval,
- lsp_refresh_interval_cmd,
- "lsp-refresh-interval <1-65235>",
- "LSP refresh interval\n"
- "LSP refresh interval in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = atoi (argv[0]);
- level = IS_LEVEL_1 | IS_LEVEL_2;
- return set_lsp_refresh_interval (vty, area, interval, level);
-}
-
-DEFUN (no_lsp_refresh_interval,
- no_lsp_refresh_interval_cmd,
- "no lsp-refresh-interval",
- NO_STR
- "LSP refresh interval in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
- level = IS_LEVEL_1 | IS_LEVEL_2;
- return set_lsp_refresh_interval (vty, area, interval, level);
-}
-
-ALIAS (no_lsp_refresh_interval,
- no_lsp_refresh_interval_arg_cmd,
- "no lsp-refresh-interval <1-65235>",
- NO_STR
- "LSP refresh interval\n"
- "LSP refresh interval in seconds\n")
-
-DEFUN (lsp_refresh_interval_l1,
- lsp_refresh_interval_l1_cmd,
- "lsp-refresh-interval level-1 <1-65235>",
- "LSP refresh interval for Level 1 only\n"
- "LSP refresh interval for Level 1 only in seconds\n")
+void
+isis_area_max_lsp_lifetime_set(struct isis_area *area, int level,
+ uint16_t max_lsp_lifetime)
{
- struct isis_area *area;
- uint16_t interval;
- int level;
+ assert((level == IS_LEVEL_1) || (level == IS_LEVEL_2));
- area = vty->index;
- interval = atoi (argv[0]);
- level = IS_LEVEL_1;
- return set_lsp_refresh_interval (vty, area, interval, level);
-}
-
-DEFUN (no_lsp_refresh_interval_l1,
- no_lsp_refresh_interval_l1_cmd,
- "no lsp-refresh-interval level-1",
- NO_STR
- "LSP refresh interval for Level 1 only in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
+ if (area->max_lsp_lifetime[level-1] == max_lsp_lifetime)
+ return;
- area = vty->index;
- interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
- level = IS_LEVEL_1;
- return set_lsp_refresh_interval (vty, area, interval, level);
+ area->max_lsp_lifetime[level-1] = max_lsp_lifetime;
+ lsp_regenerate_schedule(area, level, 1);
}
-ALIAS (no_lsp_refresh_interval_l1,
- no_lsp_refresh_interval_l1_arg_cmd,
- "no lsp-refresh-interval level-1 <1-65235>",
- NO_STR
- "LSP refresh interval for Level 1 only\n"
- "LSP refresh interval for Level 1 only in seconds\n")
-
-DEFUN (lsp_refresh_interval_l2,
- lsp_refresh_interval_l2_cmd,
- "lsp-refresh-interval level-2 <1-65235>",
- "LSP refresh interval for Level 2 only\n"
- "LSP refresh interval for Level 2 only in seconds\n")
+void
+isis_area_lsp_refresh_set(struct isis_area *area, int level,
+ uint16_t lsp_refresh)
{
- struct isis_area *area;
- uint16_t interval;
- int level;
-
- area = vty->index;
- interval = atoi (argv[0]);
- level = IS_LEVEL_2;
- return set_lsp_refresh_interval (vty, area, interval, level);
-}
+ assert((level == IS_LEVEL_1) || (level == IS_LEVEL_2));
-DEFUN (no_lsp_refresh_interval_l2,
- no_lsp_refresh_interval_l2_cmd,
- "no lsp-refresh-interval level-2",
- NO_STR
- "LSP refresh interval for Level 2 only in seconds\n")
-{
- struct isis_area *area;
- uint16_t interval;
- int level;
+ if (area->lsp_refresh[level-1] == lsp_refresh)
+ return;
- area = vty->index;
- interval = DEFAULT_MAX_LSP_GEN_INTERVAL;
- level = IS_LEVEL_2;
- return set_lsp_refresh_interval (vty, area, interval, level);
+ area->lsp_refresh[level-1] = lsp_refresh;
+ lsp_regenerate_schedule(area, level, 1);
}
-ALIAS (no_lsp_refresh_interval_l2,
- no_lsp_refresh_interval_l2_arg_cmd,
- "no lsp-refresh-interval level-2 <1-65235>",
- NO_STR
- "LSP refresh interval for Level 2 only\n"
- "LSP refresh interval for Level 2 only in seconds\n")
-
DEFUN (log_adj_changes,
log_adj_changes_cmd,
"log-adjacency-changes",
@@ -3207,46 +2636,6 @@ isis_init ()
install_element (ISIS_NODE, &domain_passwd_clear_snpauth_cmd);
install_element (ISIS_NODE, &no_domain_passwd_cmd);
- install_element (ISIS_NODE, &lsp_gen_interval_cmd);
- install_element (ISIS_NODE, &no_lsp_gen_interval_cmd);
- install_element (ISIS_NODE, &no_lsp_gen_interval_arg_cmd);
- install_element (ISIS_NODE, &lsp_gen_interval_l1_cmd);
- install_element (ISIS_NODE, &no_lsp_gen_interval_l1_cmd);
- install_element (ISIS_NODE, &no_lsp_gen_interval_l1_arg_cmd);
- install_element (ISIS_NODE, &lsp_gen_interval_l2_cmd);
- install_element (ISIS_NODE, &no_lsp_gen_interval_l2_cmd);
- install_element (ISIS_NODE, &no_lsp_gen_interval_l2_arg_cmd);
-
- install_element (ISIS_NODE, &spf_interval_cmd);
- install_element (ISIS_NODE, &no_spf_interval_cmd);
- install_element (ISIS_NODE, &no_spf_interval_arg_cmd);
- install_element (ISIS_NODE, &spf_interval_l1_cmd);
- install_element (ISIS_NODE, &no_spf_interval_l1_cmd);
- install_element (ISIS_NODE, &no_spf_interval_l1_arg_cmd);
- install_element (ISIS_NODE, &spf_interval_l2_cmd);
- install_element (ISIS_NODE, &no_spf_interval_l2_cmd);
- install_element (ISIS_NODE, &no_spf_interval_l2_arg_cmd);
-
- install_element (ISIS_NODE, &max_lsp_lifetime_cmd);
- install_element (ISIS_NODE, &no_max_lsp_lifetime_cmd);
- install_element (ISIS_NODE, &no_max_lsp_lifetime_arg_cmd);
- install_element (ISIS_NODE, &max_lsp_lifetime_l1_cmd);
- install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_cmd);
- install_element (ISIS_NODE, &no_max_lsp_lifetime_l1_arg_cmd);
- install_element (ISIS_NODE, &max_lsp_lifetime_l2_cmd);
- install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_cmd);
- install_element (ISIS_NODE, &no_max_lsp_lifetime_l2_arg_cmd);
-
- install_element (ISIS_NODE, &lsp_refresh_interval_cmd);
- install_element (ISIS_NODE, &no_lsp_refresh_interval_cmd);
- install_element (ISIS_NODE, &no_lsp_refresh_interval_arg_cmd);
- install_element (ISIS_NODE, &lsp_refresh_interval_l1_cmd);
- install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_cmd);
- install_element (ISIS_NODE, &no_lsp_refresh_interval_l1_arg_cmd);
- install_element (ISIS_NODE, &lsp_refresh_interval_l2_cmd);
- install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_cmd);
- install_element (ISIS_NODE, &no_lsp_refresh_interval_l2_arg_cmd);
-
install_element (ISIS_NODE, &log_adj_changes_cmd);
install_element (ISIS_NODE, &no_log_adj_changes_cmd);
diff --git a/isisd/isisd.h b/isisd/isisd.h
index 7a4575652..5f996970f 100644
--- a/isisd/isisd.h
+++ b/isisd/isisd.h
@@ -150,6 +150,10 @@ void isis_area_metricstyle_set(struct isis_area *area, bool old_metric,
bool new_metric);
void isis_area_lsp_mtu_set(struct isis_area *area, unsigned int lsp_mtu);
void isis_area_is_type_set(struct isis_area *area, int is_type);
+void isis_area_max_lsp_lifetime_set(struct isis_area *area, int level,
+ uint16_t max_lsp_lifetime);
+void isis_area_lsp_refresh_set(struct isis_area *area, int level,
+ uint16_t lsp_refresh);
void isis_vty_init (void);