summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRenato Westphal <renato@opensourcerouting.org>2018-05-09 01:35:01 -0300
committerRenato Westphal <renato@opensourcerouting.org>2018-10-27 16:16:12 -0200
commitb745780b5f56e9770c5ba0785bafd17b2239c6cc (patch)
tree87e54690683b69d058a6f08b18116de2936278c6
parent4068787842709160f0ba68ed71b94f9b61c8c21a (diff)
ripd: retrofit the 'timer basic' command to the new northbound model
Trivial conversion. Use the northbound 'apply_finish()' callback so we'll call rip_event() only once even if we change the three RIP timers at the same time. Convert the timers to uint32_t to match their representation in the YANG model. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
-rw-r--r--ripd/rip_cli.c75
-rw-r--r--ripd/rip_cli.h2
-rw-r--r--ripd/rip_northbound.c32
-rw-r--r--ripd/ripd.c89
-rw-r--r--ripd/ripd.h12
5 files changed, 113 insertions, 97 deletions
diff --git a/ripd/rip_cli.c b/ripd/rip_cli.c
index 00608b0266..a89df5b2f1 100644
--- a/ripd/rip_cli.c
+++ b/ripd/rip_cli.c
@@ -639,6 +639,79 @@ void cli_show_rip_route(struct vty *vty, struct lyd_node *dnode,
vty_out(vty, " route %s\n", yang_dnode_get_string(dnode, NULL));
}
+/*
+ * XPath: /frr-ripd:ripd/instance/timers
+ */
+DEFPY (rip_timers,
+ rip_timers_cmd,
+ "timers basic (5-2147483647)$update (5-2147483647)$timeout (5-2147483647)$garbage",
+ "Adjust routing timers\n"
+ "Basic routing protocol update timers\n"
+ "Routing table update timer value in second. Default is 30.\n"
+ "Routing information timeout timer. Default is 180.\n"
+ "Garbage collection timer. Default is 120.\n")
+{
+ struct cli_config_change changes[] = {
+ {
+ .xpath = "./timers/update-interval",
+ .operation = NB_OP_MODIFY,
+ .value = update_str,
+ },
+ {
+ .xpath = "./timers/holddown-interval",
+ .operation = NB_OP_MODIFY,
+ .value = timeout_str,
+ },
+ {
+ .xpath = "./timers/flush-interval",
+ .operation = NB_OP_MODIFY,
+ .value = garbage_str,
+ },
+ };
+
+ return nb_cli_cfg_change(vty, NULL, changes, array_size(changes));
+}
+
+DEFPY (no_rip_timers,
+ no_rip_timers_cmd,
+ "no timers basic [(5-2147483647) (5-2147483647) (5-2147483647)]",
+ NO_STR
+ "Adjust routing timers\n"
+ "Basic routing protocol update timers\n"
+ "Routing table update timer value in second. Default is 30.\n"
+ "Routing information timeout timer. Default is 180.\n"
+ "Garbage collection timer. Default is 120.\n")
+{
+ struct cli_config_change changes[] = {
+ {
+ .xpath = "./timers/update-interval",
+ .operation = NB_OP_MODIFY,
+ .value = NULL,
+ },
+ {
+ .xpath = "./timers/holddown-interval",
+ .operation = NB_OP_MODIFY,
+ .value = NULL,
+ },
+ {
+ .xpath = "./timers/flush-interval",
+ .operation = NB_OP_MODIFY,
+ .value = NULL,
+ },
+ };
+
+ return nb_cli_cfg_change(vty, NULL, changes, array_size(changes));
+}
+
+void cli_show_rip_timers(struct vty *vty, struct lyd_node *dnode,
+ bool show_defaults)
+{
+ vty_out(vty, " timers basic %s %s %s\n",
+ yang_dnode_get_string(dnode, "./update-interval"),
+ yang_dnode_get_string(dnode, "./holddown-interval"),
+ yang_dnode_get_string(dnode, "./flush-interval"));
+}
+
void rip_cli_init(void)
{
install_element(CONFIG_NODE, &router_rip_cmd);
@@ -662,4 +735,6 @@ void rip_cli_init(void)
install_element(RIP_NODE, &rip_redistribute_cmd);
install_element(RIP_NODE, &no_rip_redistribute_cmd);
install_element(RIP_NODE, &rip_route_cmd);
+ install_element(RIP_NODE, &rip_timers_cmd);
+ install_element(RIP_NODE, &no_rip_timers_cmd);
}
diff --git a/ripd/rip_cli.h b/ripd/rip_cli.h
index 3d06cc7a43..1fe13601b6 100644
--- a/ripd/rip_cli.h
+++ b/ripd/rip_cli.h
@@ -57,5 +57,7 @@ extern void cli_show_rip_redistribute(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
extern void cli_show_rip_route(struct vty *vty, struct lyd_node *dnode,
bool show_defaults);
+extern void cli_show_rip_timers(struct vty *vty, struct lyd_node *dnode,
+ bool show_defaults);
#endif /* _FRR_RIP_CLI_H_ */
diff --git a/ripd/rip_northbound.c b/ripd/rip_northbound.c
index ffb4a10c9e..a99a92de9b 100644
--- a/ripd/rip_northbound.c
+++ b/ripd/rip_northbound.c
@@ -692,6 +692,15 @@ static int ripd_instance_static_route_delete(enum nb_event event,
}
/*
+ * XPath: /frr-ripd:ripd/instance/timers/
+ */
+static void ripd_instance_timers_apply_finish(const struct lyd_node *dnode)
+{
+ /* Reset update timer thread. */
+ rip_event(RIP_UPDATE_EVENT, 0);
+}
+
+/*
* XPath: /frr-ripd:ripd/instance/timers/flush-interval
*/
static int
@@ -699,7 +708,11 @@ ripd_instance_timers_flush_interval_modify(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ rip->garbage_time = yang_dnode_get_uint32(dnode, NULL);
+
return NB_OK;
}
@@ -711,7 +724,11 @@ ripd_instance_timers_holddown_interval_modify(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ rip->timeout_time = yang_dnode_get_uint32(dnode, NULL);
+
return NB_OK;
}
@@ -723,7 +740,11 @@ ripd_instance_timers_update_interval_modify(enum nb_event event,
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ rip->update_time = yang_dnode_get_uint32(dnode, NULL);
+
return NB_OK;
}
@@ -1129,6 +1150,11 @@ const struct frr_yang_module_info frr_ripd_info = {
.cbs.cli_show = cli_show_rip_route,
},
{
+ .xpath = "/frr-ripd:ripd/instance/timers",
+ .cbs.apply_finish = ripd_instance_timers_apply_finish,
+ .cbs.cli_show = cli_show_rip_timers,
+ },
+ {
.xpath = "/frr-ripd:ripd/instance/timers/flush-interval",
.cbs.modify = ripd_instance_timers_flush_interval_modify,
},
diff --git a/ripd/ripd.c b/ripd/ripd.c
index 806d55eb3c..411a1ddc8f 100644
--- a/ripd/ripd.c
+++ b/ripd/ripd.c
@@ -65,7 +65,6 @@ long rip_global_route_changes = 0;
long rip_global_queries = 0;
/* Prototypes. */
-static void rip_event(enum rip_event, int);
static void rip_output_process(struct connected *, struct sockaddr_in *, int,
uint8_t);
static int rip_triggered_update(struct thread *);
@@ -2851,78 +2850,6 @@ rip_update_default_metric (void)
}
#endif
-DEFUN (rip_timers,
- rip_timers_cmd,
- "timers basic (5-2147483647) (5-2147483647) (5-2147483647)",
- "Adjust routing timers\n"
- "Basic routing protocol update timers\n"
- "Routing table update timer value in second. Default is 30.\n"
- "Routing information timeout timer. Default is 180.\n"
- "Garbage collection timer. Default is 120.\n")
-{
- int idx_number = 2;
- int idx_number_2 = 3;
- int idx_number_3 = 4;
- unsigned long update;
- unsigned long timeout;
- unsigned long garbage;
- char *endptr = NULL;
- unsigned long RIP_TIMER_MAX = 2147483647;
- unsigned long RIP_TIMER_MIN = 5;
-
- update = strtoul(argv[idx_number]->arg, &endptr, 10);
- if (update > RIP_TIMER_MAX || update < RIP_TIMER_MIN
- || *endptr != '\0') {
- vty_out(vty, "update timer value error\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- timeout = strtoul(argv[idx_number_2]->arg, &endptr, 10);
- if (timeout > RIP_TIMER_MAX || timeout < RIP_TIMER_MIN
- || *endptr != '\0') {
- vty_out(vty, "timeout timer value error\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- garbage = strtoul(argv[idx_number_3]->arg, &endptr, 10);
- if (garbage > RIP_TIMER_MAX || garbage < RIP_TIMER_MIN
- || *endptr != '\0') {
- vty_out(vty, "garbage timer value error\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- /* Set each timer value. */
- rip->update_time = update;
- rip->timeout_time = timeout;
- rip->garbage_time = garbage;
-
- /* Reset update timer thread. */
- rip_event(RIP_UPDATE_EVENT, 0);
-
- return CMD_SUCCESS;
-}
-
-DEFUN (no_rip_timers,
- no_rip_timers_cmd,
- "no timers basic [(0-65535) (0-65535) (0-65535)]",
- NO_STR
- "Adjust routing timers\n"
- "Basic routing protocol update timers\n"
- "Routing table update timer value in second. Default is 30.\n"
- "Routing information timeout timer. Default is 180.\n"
- "Garbage collection timer. Default is 120.\n")
-{
- /* Set each timer value to the default. */
- rip->update_time = RIP_UPDATE_TIMER_DEFAULT;
- rip->timeout_time = RIP_TIMEOUT_TIMER_DEFAULT;
- rip->garbage_time = RIP_GARBAGE_TIMER_DEFAULT;
-
- /* Reset update timer thread. */
- rip_event(RIP_UPDATE_EVENT, 0);
-
- return CMD_SUCCESS;
-}
-
struct route_table *rip_distance_table;
@@ -3219,12 +3146,12 @@ DEFUN (show_ip_rip_status,
return CMD_SUCCESS;
vty_out(vty, "Routing Protocol is \"rip\"\n");
- vty_out(vty, " Sending updates every %ld seconds with +/-50%%,",
+ vty_out(vty, " Sending updates every %u seconds with +/-50%%,",
rip->update_time);
vty_out(vty, " next due in %lu seconds\n",
thread_timer_remain_second(rip->t_update));
- vty_out(vty, " Timeout after %ld seconds,", rip->timeout_time);
- vty_out(vty, " garbage collect after %ld seconds\n", rip->garbage_time);
+ vty_out(vty, " Timeout after %u seconds,", rip->timeout_time);
+ vty_out(vty, " garbage collect after %u seconds\n", rip->garbage_time);
/* Filtering status show. */
config_show_distribute(vty);
@@ -3325,14 +3252,6 @@ static int config_write_rip(struct vty *vty)
|| rip->version_recv != RI_RIP_VERSION_1_AND_2)
vty_out(vty, " version %d\n", rip->version_send);
- /* RIP timer configuration. */
- if (rip->update_time != RIP_UPDATE_TIMER_DEFAULT
- || rip->timeout_time != RIP_TIMEOUT_TIMER_DEFAULT
- || rip->garbage_time != RIP_GARBAGE_TIMER_DEFAULT)
- vty_out(vty, " timers basic %lu %lu %lu\n",
- rip->update_time, rip->timeout_time,
- rip->garbage_time);
-
/* Distribute configuration. */
write += config_write_distribute(vty);
@@ -3603,8 +3522,6 @@ void rip_init(void)
install_default(RIP_NODE);
install_element(RIP_NODE, &rip_version_cmd);
install_element(RIP_NODE, &no_rip_version_cmd);
- install_element(RIP_NODE, &rip_timers_cmd);
- install_element(RIP_NODE, &no_rip_timers_cmd);
/* Debug related init. */
rip_debug_init();
diff --git a/ripd/ripd.h b/ripd/ripd.h
index 5ac2be9abb..c8bc68c09f 100644
--- a/ripd/ripd.h
+++ b/ripd/ripd.h
@@ -60,11 +60,6 @@
#define INADDR_RIP_GROUP 0xe0000009 /* 224.0.0.9 */
#endif
-/* RIP timers */
-#define RIP_UPDATE_TIMER_DEFAULT 30
-#define RIP_TIMEOUT_TIMER_DEFAULT 180
-#define RIP_GARBAGE_TIMER_DEFAULT 120
-
/* RIP peer timeout value. */
#define RIP_PEER_TIMER_DEFAULT 180
@@ -132,9 +127,9 @@ struct rip {
struct thread *t_triggered_interval;
/* RIP timer values. */
- unsigned long update_time;
- unsigned long timeout_time;
- unsigned long garbage_time;
+ uint32_t update_time;
+ uint32_t timeout_time;
+ uint32_t garbage_time;
/* RIP default metric. */
uint8_t default_metric;
@@ -412,6 +407,7 @@ extern int rip_enable_network_delete(struct prefix *p);
extern int rip_enable_if_add(const char *ifname);
extern int rip_enable_if_delete(const char *ifname);
+extern void rip_event(enum rip_event, int);
extern void rip_ecmp_disable(void);
extern int rip_create_socket(void);