]> git.puffer.fish Git - matthieu/frr.git/commitdiff
fabricd: make triggered csnp delay configurable
authorChristian Franke <chris@opensourcerouting.org>
Fri, 23 Nov 2018 03:26:19 +0000 (04:26 +0100)
committerRodny Molina <rmolina@linkedin.com>
Fri, 7 Dec 2018 19:45:14 +0000 (19:45 +0000)
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
isisd/fabricd.c
isisd/fabricd.h
isisd/isis_pdu.c
isisd/isis_vty_fabricd.c

index 537dc9966157f2aec5e897eb84c48093a6f66d5d..e1d838429de25c9f2df08ae0f822aa4a6d9e956c 100644 (file)
@@ -65,6 +65,9 @@ struct fabricd {
        uint8_t tier_pending;
        struct thread *tier_calculation_timer;
        struct thread *tier_set_timer;
+
+       int csnp_delay;
+       bool always_send_csnp;
 };
 
 /* Code related to maintaining the neighbor lists */
@@ -211,6 +214,8 @@ struct fabricd *fabricd_new(struct isis_area *area)
                                              "Fabricd Neighbors");
 
        rv->tier = rv->tier_config = ISIS_TIER_UNDEFINED;
+
+       rv->csnp_delay = FABRICD_DEFAULT_CSNP_DELAY;
        return rv;
 };
 
@@ -506,6 +511,12 @@ int fabricd_write_settings(struct isis_area *area, struct vty *vty)
                written++;
        }
 
+       if (f->csnp_delay != FABRICD_DEFAULT_CSNP_DELAY
+           || f->always_send_csnp) {
+               vty_out(vty, " triggered-csnp-delay %d%s\n", f->csnp_delay,
+                       f->always_send_csnp ? " always" : "");
+       }
+
        return written;
 }
 
@@ -707,13 +718,16 @@ void fabricd_lsp_flood(struct isis_lsp *lsp, struct isis_circuit *circuit)
        }
 }
 
-void fabricd_trigger_csnp(struct isis_area *area)
+void fabricd_trigger_csnp(struct isis_area *area, bool circuit_scoped)
 {
        struct fabricd *f = area->fabricd;
 
        if (!f)
                return;
 
+       if (!circuit_scoped && !f->always_send_csnp)
+               return;
+
        struct listnode *node;
        struct isis_circuit *circuit;
 
@@ -723,7 +737,7 @@ void fabricd_trigger_csnp(struct isis_area *area)
 
                thread_cancel(circuit->t_send_csnp[ISIS_LEVEL2 - 1]);
                thread_add_timer_msec(master, send_l2_csnp, circuit,
-                                     isis_jitter(500, CSNP_JITTER),
+                                     isis_jitter(f->csnp_delay, CSNP_JITTER),
                                      &circuit->t_send_csnp[ISIS_LEVEL2 - 1]);
        }
 }
@@ -773,3 +787,15 @@ void fabricd_update_lsp_no_flood(struct isis_lsp *lsp,
        fabricd_lsp_reset_flooding_info(lsp, circuit);
        lsp->flooding_circuit_scoped = true;
 }
+
+void fabricd_configure_triggered_csnp(struct isis_area *area, int delay,
+                                     bool always_send_csnp)
+{
+       struct fabricd *f = area->fabricd;
+
+       if (!f)
+               return;
+
+       f->csnp_delay = delay;
+       f->always_send_csnp = always_send_csnp;
+}
index 6b55cce38e5dacf2b7503cbb317b14c4c33b8ce8..8c850c628ff4a2535ca6e86a3640375a0e952968 100644 (file)
@@ -22,6 +22,8 @@
 #ifndef FABRICD_H
 #define FABRICD_H
 
+#define FABRICD_DEFAULT_CSNP_DELAY 500
+
 struct fabricd;
 
 struct isis_circuit;
@@ -43,10 +45,12 @@ void fabricd_configure_tier(struct isis_area *area, uint8_t tier);
 uint8_t fabricd_tier(struct isis_area *area);
 int fabricd_write_settings(struct isis_area *area, struct vty *vty);
 void fabricd_lsp_flood(struct isis_lsp *lsp, struct isis_circuit *circuit);
-void fabricd_trigger_csnp(struct isis_area *area);
+void fabricd_trigger_csnp(struct isis_area *area, bool circuit_scoped);
 struct list *fabricd_ip_addrs(struct isis_circuit *circuit);
 void fabricd_lsp_free(struct isis_lsp *lsp);
 void fabricd_update_lsp_no_flood(struct isis_lsp *lsp,
                                 struct isis_circuit *circuit);
+void fabricd_configure_triggered_csnp(struct isis_area *area, int delay,
+                                     bool always_send_csnp);
 
 #endif
index 0c352422bc7ca1da1f1cb86e51234219267a39e2..53cd142dae8b36b24cfde52f217fec4b76674266 100644 (file)
@@ -1105,9 +1105,7 @@ dontcheckadj:
        retval = ISIS_OK;
 
 out:
-       if (circuit_scoped) {
-               fabricd_trigger_csnp(circuit->area);
-       }
+       fabricd_trigger_csnp(circuit->area, circuit_scoped);
 
        isis_free_tlvs(tlvs);
        return retval;
index bd40201041ead724b137fbb22074f33ab7253fee..aa4ccdd075558c90c6c96d643762ec2455c6a63a 100644 (file)
@@ -57,6 +57,37 @@ DEFUN (no_fabric_tier,
        return CMD_SUCCESS;
 }
 
+DEFUN (triggered_csnp,
+       triggered_csnp_cmd,
+       "triggered-csnp-delay (100-10000) [always]",
+       "Configure the delay for triggered CSNPs\n"
+       "Delay in milliseconds\n"
+       "Trigger CSNP for all LSPs, not only circuit-scoped\n")
+{
+       VTY_DECLVAR_CONTEXT(isis_area, area);
+
+       int csnp_delay = atoi(argv[1]->arg);
+       bool always_send_csnp = (argc == 3);
+
+       fabricd_configure_triggered_csnp(area, csnp_delay, always_send_csnp);
+       return CMD_SUCCESS;
+}
+
+DEFUN (no_triggered_csnp,
+       no_triggered_csnp_cmd,
+       "no triggered-csnp-delay [(100-10000) [always]]",
+       NO_STR
+       "Configure the delay for triggered CSNPs\n"
+       "Delay in milliseconds\n"
+       "Trigger CSNP for all LSPs, not only circuit-scoped\n")
+{
+       VTY_DECLVAR_CONTEXT(isis_area, area);
+
+       fabricd_configure_triggered_csnp(area, FABRICD_DEFAULT_CSNP_DELAY,
+                                        false);
+       return CMD_SUCCESS;
+}
+
 static void lsp_print_flooding(struct vty *vty, struct isis_lsp *lsp)
 {
        char lspid[255];
@@ -154,6 +185,8 @@ void isis_vty_daemon_init(void)
 {
        install_element(ROUTER_NODE, &fabric_tier_cmd);
        install_element(ROUTER_NODE, &no_fabric_tier_cmd);
+       install_element(ROUTER_NODE, &triggered_csnp_cmd);
+       install_element(ROUTER_NODE, &no_triggered_csnp_cmd);
 
        install_element(ENABLE_NODE, &show_lsp_flooding_cmd);
 }