diff --git a/lib/command.h b/lib/command.h index e2d31decd4..9e6c954f15 100644 --- a/lib/command.h +++ b/lib/command.h @@ -358,6 +358,7 @@ struct cmd_node { #define PCE_STR "PCE Router Information specific commands\n" #define MPLS_STR "MPLS information\n" #define WATCHFRR_STR "watchfrr information\n" +#define ZEBRA_STR "Zebra information\n" #define CONF_BACKUP_EXT ".sav" diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c index 022b913168..a900648236 100644 --- a/ospf6d/ospf6_zebra.c +++ b/ospf6d/ospf6_zebra.c @@ -256,7 +256,7 @@ DEFUN (show_zebra, SHOW_STR IPV6_STR OSPF6_STR - "Zebra information\n") + ZEBRA_STR) { int i; if (zclient == NULL) { diff --git a/ospfd/ospf_dump.c b/ospfd/ospf_dump.c index 5933f5abfe..6876054a63 100644 --- a/ospfd/ospf_dump.c +++ b/ospfd/ospf_dump.c @@ -1182,7 +1182,7 @@ DEFUN (debug_ospf_zebra, "debug ospf zebra []", DEBUG_STR OSPF_STR - "OSPF Zebra information\n" + ZEBRA_STR "Zebra interface\n" "Zebra redistribute\n") { @@ -1195,7 +1195,7 @@ DEFUN (debug_ospf_instance_zebra, DEBUG_STR OSPF_STR "Instance ID\n" - "OSPF Zebra information\n" + ZEBRA_STR "Zebra interface\n" "Zebra redistribute\n") { @@ -1245,7 +1245,7 @@ DEFUN (no_debug_ospf_zebra, NO_STR DEBUG_STR OSPF_STR - "OSPF Zebra information\n" + ZEBRA_STR "Zebra interface\n" "Zebra redistribute\n") { @@ -1259,7 +1259,7 @@ DEFUN (no_debug_ospf_instance_zebra, DEBUG_STR OSPF_STR "Instance ID\n" - "OSPF Zebra information\n" + ZEBRA_STR "Zebra interface\n" "Zebra redistribute\n") { diff --git a/zebra/main.c b/zebra/main.c index 5a2979c866..cf677a7753 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -53,6 +53,7 @@ /* Zebra instance */ struct zebra_t zebrad = { .rtm_table_default = 0, + .packets_to_process = ZEBRA_ZAPI_PACKETS_TO_PROCESS, }; /* process id. */ diff --git a/zebra/zebra_fpm.c b/zebra/zebra_fpm.c index a5d256b7aa..0ffa55f1e4 100644 --- a/zebra/zebra_fpm.c +++ b/zebra/zebra_fpm.c @@ -1413,7 +1413,7 @@ DEFUN (show_zebra_fpm_stats, show_zebra_fpm_stats_cmd, "show zebra fpm stats", SHOW_STR - "Zebra information\n" + ZEBRA_STR "Forwarding Path Manager information\n" "Statistics\n") { @@ -1428,7 +1428,7 @@ DEFUN (clear_zebra_fpm_stats, clear_zebra_fpm_stats_cmd, "clear zebra fpm stats", CLEAR_STR - "Zebra information\n" + ZEBRA_STR "Clear Forwarding Path Manager information\n" "Statistics\n") { diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index d46e0730ee..b5c2bc6dae 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -57,12 +57,6 @@ DEFINE_HOOK(rib_update, (struct route_node * rn, const char *reason), /* Should we allow non Quagga processes to delete our routes */ extern int allow_delete; -/* Hold time for RIB process, should be very minimal. - * it is useful to able to set it otherwise for testing, hence exported - * as global here for test-rig code. - */ -int rib_process_hold_time = 10; - /* Each route type's string and default distance value. */ static const struct { int key; @@ -1899,7 +1893,7 @@ static void rib_queue_init(struct zebra_t *zebra) zebra->ribq->spec.completion_func = &meta_queue_process_complete; /* XXX: TODO: These should be runtime configurable via vty */ zebra->ribq->spec.max_retries = 3; - zebra->ribq->spec.hold = rib_process_hold_time; + zebra->ribq->spec.hold = ZEBRA_RIB_PROCESS_HOLD_TIME; if (!(zebra->mq = meta_queue_new())) { zlog_err("%s: could not initialise meta queue!", __func__); diff --git a/zebra/zebra_routemap.c b/zebra/zebra_routemap.c index dd0189666e..7bfaf8e275 100644 --- a/zebra/zebra_routemap.c +++ b/zebra/zebra_routemap.c @@ -392,7 +392,7 @@ DEFUN (no_set_src, DEFUN (zebra_route_map_timer, zebra_route_map_timer_cmd, "zebra route-map delay-timer (0-600)", - "Zebra information\n" + ZEBRA_STR "Set route-map parameters\n" "Time to wait before route-map updates are processed\n" "0 means event-driven updates are disabled\n") @@ -410,7 +410,7 @@ DEFUN (no_zebra_route_map_timer, no_zebra_route_map_timer_cmd, "no zebra route-map delay-timer [(0-600)]", NO_STR - "Zebra information\n" + ZEBRA_STR "Set route-map parameters\n" "Reset delay-timer to default value, 30 secs\n" "0 means event-driven updates are disabled\n") diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 008afdfa4f..73f0717124 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -44,6 +44,7 @@ #include "lib/json.h" #include "zebra/zebra_vxlan.h" #include "zebra/zebra_vty_clippy.c" +#include "zebra/zserv.h" extern int allow_delete; @@ -2186,6 +2187,59 @@ DEFUN (ip_zebra_import_table_distance, return ret; } +DEFUN_HIDDEN (zebra_packet_process, + zebra_packet_process_cmd, + "zebra zapi-packets (1-10000)", + ZEBRA_STR + "Zapi Protocol\n" + "Number of packets to process before relinquishing thread\n") +{ + uint32_t packets = strtoul(argv[2]->arg, NULL, 10); + + zebrad.packets_to_process = packets; + + return CMD_SUCCESS; +} + +DEFUN_HIDDEN (no_zebra_packet_process, + no_zebra_packet_process_cmd, + "no zebra zapi-packets [(1-10000)]", + NO_STR + ZEBRA_STR + "Zapi Protocol\n" + "Number of packets to process before relinquishing thread\n") +{ + zebrad.packets_to_process = ZEBRA_ZAPI_PACKETS_TO_PROCESS; + + return CMD_SUCCESS; +} + +DEFUN_HIDDEN (zebra_workqueue_timer, + zebra_workqueue_timer_cmd, + "zebra work-queue (0-10000)", + ZEBRA_STR + "Work Queue\n" + "Time in milliseconds\n") +{ + uint32_t timer = strtoul(argv[2]->arg, NULL, 10); + zebrad.ribq->spec.hold = timer; + + return CMD_SUCCESS; +} + +DEFUN_HIDDEN (no_zebra_workqueue_timer, + no_zebra_workqueue_timer_cmd, + "no zebra work-queue [(0-10000)]", + NO_STR + ZEBRA_STR + "Work Queue\n" + "Time in milliseconds\n") +{ + zebrad.ribq->spec.hold = ZEBRA_RIB_PROCESS_HOLD_TIME; + + return CMD_SUCCESS; +} + DEFUN (no_ip_zebra_import_table, no_ip_zebra_import_table_cmd, "no ip import-table (1-252) [distance (1-255)] [route-map NAME]", @@ -2231,6 +2285,13 @@ static int config_write_protocol(struct vty *vty) if (zebra_rnh_ipv6_default_route) vty_out(vty, "ipv6 nht resolve-via-default\n"); + if (zebrad.ribq->spec.hold != ZEBRA_RIB_PROCESS_HOLD_TIME) + vty_out(vty, "zebra work-queue %u\n", zebrad.ribq->spec.hold); + + if (zebrad.packets_to_process != ZEBRA_ZAPI_PACKETS_TO_PROCESS) + vty_out(vty, + "zebra zapi-packets %u\n", zebrad.packets_to_process); + enum multicast_mode ipv4_multicast_mode = multicast_mode_ipv4_get(); if (ipv4_multicast_mode != MCAST_NO_CONFIG) @@ -2272,6 +2333,10 @@ void zebra_vty_init(void) install_element(CONFIG_NODE, &ip_route_cmd); install_element(CONFIG_NODE, &ip_zebra_import_table_distance_cmd); install_element(CONFIG_NODE, &no_ip_zebra_import_table_cmd); + install_element(CONFIG_NODE, &zebra_workqueue_timer_cmd); + install_element(CONFIG_NODE, &no_zebra_workqueue_timer_cmd); + install_element(CONFIG_NODE, &zebra_packet_process_cmd); + install_element(CONFIG_NODE, &no_zebra_packet_process_cmd); install_element(VIEW_NODE, &show_vrf_cmd); install_element(VIEW_NODE, &show_route_cmd); diff --git a/zebra/zserv.c b/zebra/zserv.c index 15bfd37da8..cbd532339d 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -2387,7 +2387,7 @@ static int zebra_client_read(struct thread *thread) uint8_t marker, version; vrf_id_t vrf_id; struct zebra_vrf *zvrf; - int packets = 10; + int packets = zebrad.packets_to_process; /* Get thread data. Reset reading thread because I'm running. */ sock = THREAD_FD(thread); @@ -2841,7 +2841,7 @@ DEFUN (show_zebra, show_zebra_cmd, "show zebra", SHOW_STR - "Zebra information\n") + ZEBRA_STR) { struct vrf *vrf; @@ -2866,7 +2866,7 @@ DEFUN (show_zebra_client, show_zebra_client_cmd, "show zebra client", SHOW_STR - "Zebra information\n" + ZEBRA_STR "Client information\n") { struct listnode *node; @@ -2883,7 +2883,7 @@ DEFUN (show_zebra_client_summary, show_zebra_client_summary_cmd, "show zebra client summary", SHOW_STR - "Zebra information brief\n" + ZEBRA_STR "Client information brief\n" "Brief Summary\n") { diff --git a/zebra/zserv.h b/zebra/zserv.h index f661572d53..279b56ec3c 100644 --- a/zebra/zserv.h +++ b/zebra/zserv.h @@ -132,11 +132,15 @@ struct zebra_t { u_int32_t rtm_table_default; /* rib work queue */ + #define ZEBRA_RIB_PROCESS_HOLD_TIME 10 struct work_queue *ribq; struct meta_queue *mq; /* LSP work queue */ struct work_queue *lsp_process_q; + + #define ZEBRA_ZAPI_PACKETS_TO_PROCESS 10 + u_int32_t packets_to_process; }; extern struct zebra_t zebrad; extern unsigned int multipath_num;