diff options
author | Yuxiang Zhu <vfreex@gmail.com> | 2023-02-07 01:23:46 +0800 |
---|---|---|
committer | Yuxiang Zhu <vfreex@gmail.com> | 2023-02-07 01:25:39 +0800 |
commit | 2958ae76f5658a817d7fdd0fcc44a55cf4d3e841 (patch) | |
tree | 08218d61ed09c251fdd12e94e863b33275d277f5 /packages/frr | |
parent | 2767ac346e4d1a3a6efcd8a0283af4e36c07a9e6 (diff) | |
download | vyos-build-2958ae76f5658a817d7fdd0fcc44a55cf4d3e841.tar.gz vyos-build-2958ae76f5658a817d7fdd0fcc44a55cf4d3e841.zip |
T4977: Add FRR patches for Babel support
Backports the following PRs to FRR 8.4:
- 0001-tools-Add-missing-daemons.patch: backported from https://github.com/FRRouting/frr/pull/12611
- 0002-babeld-Add-missing-no-commands.patch: backported from https://github.com/FRRouting/frr/pull/12640
Signed-off-by: Yuxiang Zhu <vfreex@gmail.com>
Diffstat (limited to 'packages/frr')
-rw-r--r-- | packages/frr/patches/0001-tools-Add-missing-daemons.patch | 37 | ||||
-rw-r--r-- | packages/frr/patches/0002-babeld-Add-missing-no-commands.patch | 526 |
2 files changed, 563 insertions, 0 deletions
diff --git a/packages/frr/patches/0001-tools-Add-missing-daemons.patch b/packages/frr/patches/0001-tools-Add-missing-daemons.patch new file mode 100644 index 00000000..0dd7d1c6 --- /dev/null +++ b/packages/frr/patches/0001-tools-Add-missing-daemons.patch @@ -0,0 +1,37 @@ +From bad924dd359670b92cfb44e4657ba047a0ffec10 Mon Sep 17 00:00:00 2001 +From: Yuxiang Zhu <vfreex@gmail.com> +Date: Tue, 10 Jan 2023 03:18:05 +0800 +Subject: [PATCH 1/2] tools: Add missing daemons + +Got `ERROR: Daemon babeld is not a valid option for 'show running-config'` when using `frr-reload.py --reload --daemon babeld`. + +Adds `babeld` and `nhrpd` as valid daemons. + +Signed-off-by: Yuxiang Zhu <vfreex@gmail.com> +--- + tools/frr-reload.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tools/frr-reload.py b/tools/frr-reload.py +index bf402e1be..dfbc9b800 100755 +--- a/tools/frr-reload.py ++++ b/tools/frr-reload.py +@@ -1914,6 +1914,7 @@ if __name__ == "__main__": + "bgpd", + "fabricd", + "isisd", ++ "babeld", + "ospf6d", + "ospfd", + "pbrd", +@@ -1925,6 +1926,7 @@ if __name__ == "__main__": + "staticd", + "vrrpd", + "ldpd", ++ "nhrpd", + "pathd", + "bfdd", + "eigrpd", +-- +2.37.1 (Apple Git-137.1) + diff --git a/packages/frr/patches/0002-babeld-Add-missing-no-commands.patch b/packages/frr/patches/0002-babeld-Add-missing-no-commands.patch new file mode 100644 index 00000000..af7226ed --- /dev/null +++ b/packages/frr/patches/0002-babeld-Add-missing-no-commands.patch @@ -0,0 +1,526 @@ +From 7d3ab29ab035996038c1cbee1f26627a8313e220 Mon Sep 17 00:00:00 2001 +From: Yuxiang Zhu <vfreex@gmail.com> +Date: Sat, 14 Jan 2023 20:02:41 +0800 +Subject: [PATCH 2/2] babeld: Add missing `no` commands + +Some babeld commands doesn't have the corresponding negative commands +defined, so those commands doesn't work with frr-reload.py. + +This PR adds those missing commands. + +Signed-off-by: Yuxiang Zhu <vfreex@gmail.com> +--- + babeld/.gitignore | 1 + + babeld/babel_interface.c | 209 ++++++++++++++------------------------- + babeld/babeld.c | 38 ++++--- + babeld/subdir.am | 4 + + 4 files changed, 98 insertions(+), 154 deletions(-) + +diff --git a/babeld/.gitignore b/babeld/.gitignore +index 71ef6786c..abb4d9321 100644 +--- a/babeld/.gitignore ++++ b/babeld/.gitignore +@@ -5,3 +5,4 @@ + !Makefile + !subdir.am + !.gitignore ++*_clippy.c +diff --git a/babeld/babel_interface.c b/babeld/babel_interface.c +index 00fb58e57..cc5089801 100644 +--- a/babeld/babel_interface.c ++++ b/babeld/babel_interface.c +@@ -42,6 +42,10 @@ THE SOFTWARE. + #include "xroute.h" + #include "babel_errors.h" + ++#ifndef VTYSH_EXTRACT_PL ++#include "babeld/babel_interface_clippy.c" ++#endif ++ + DEFINE_MTYPE_STATIC(BABELD, BABEL_IF, "Babel Interface"); + + #define IS_ENABLE(ifp) (babel_enable_if_lookup(ifp->name) >= 0) +@@ -307,9 +311,10 @@ babel_set_wired_internal(babel_interface_nfo *babel_ifp, int wired) + } + + /* [Interface Command] Tell the interface is wire. */ +-DEFUN (babel_set_wired, ++DEFPY (babel_set_wired, + babel_set_wired_cmd, +- "babel wired", ++ "[no] babel wired", ++ NO_STR + "Babel interface commands\n" + "Enable wired optimizations\n") + { +@@ -319,14 +324,15 @@ DEFUN (babel_set_wired, + babel_ifp = babel_get_if_nfo(ifp); + + assert (babel_ifp != NULL); +- babel_set_wired_internal(babel_ifp, 1); ++ babel_set_wired_internal(babel_ifp, no ? 0 : 1); + return CMD_SUCCESS; + } + + /* [Interface Command] Tell the interface is wireless (default). */ +-DEFUN (babel_set_wireless, ++DEFPY (babel_set_wireless, + babel_set_wireless_cmd, +- "babel wireless", ++ "[no] babel wireless", ++ NO_STR + "Babel interface commands\n" + "Disable wired optimizations (assume wireless)\n") + { +@@ -336,34 +342,17 @@ DEFUN (babel_set_wireless, + babel_ifp = babel_get_if_nfo(ifp); + + assert (babel_ifp != NULL); +- babel_set_wired_internal(babel_ifp, 0); ++ babel_set_wired_internal(babel_ifp, no ? 1 : 0); + return CMD_SUCCESS; + } + + /* [Interface Command] Enable split horizon. */ +-DEFUN (babel_split_horizon, ++DEFPY (babel_split_horizon, + babel_split_horizon_cmd, +- "babel split-horizon", +- "Babel interface commands\n" +- "Enable split horizon processing\n") +-{ +- VTY_DECLVAR_CONTEXT(interface, ifp); +- babel_interface_nfo *babel_ifp; +- +- babel_ifp = babel_get_if_nfo(ifp); +- +- assert (babel_ifp != NULL); +- babel_ifp->flags |= BABEL_IF_SPLIT_HORIZON; +- return CMD_SUCCESS; +-} +- +-/* [Interface Command] Disable split horizon (default). */ +-DEFUN (no_babel_split_horizon, +- no_babel_split_horizon_cmd, +- "no babel split-horizon", ++ "[no] babel split-horizon", + NO_STR + "Babel interface commands\n" +- "Disable split horizon processing\n") ++ "Enable split horizon processing\n") + { + VTY_DECLVAR_CONTEXT(interface, ifp); + babel_interface_nfo *babel_ifp; +@@ -371,213 +360,180 @@ DEFUN (no_babel_split_horizon, + babel_ifp = babel_get_if_nfo(ifp); + + assert (babel_ifp != NULL); +- babel_ifp->flags &= ~BABEL_IF_SPLIT_HORIZON; ++ if (!no) ++ SET_FLAG(babel_ifp->flags, BABEL_IF_SPLIT_HORIZON); ++ else ++ UNSET_FLAG(babel_ifp->flags, BABEL_IF_SPLIT_HORIZON); + return CMD_SUCCESS; + } + + /* [Interface Command]. */ +-DEFUN (babel_set_hello_interval, ++DEFPY (babel_set_hello_interval, + babel_set_hello_interval_cmd, +- "babel hello-interval (20-655340)", ++ "[no] babel hello-interval (20-655340)", ++ NO_STR + "Babel interface commands\n" + "Time between scheduled hellos\n" + "Milliseconds\n") + { + VTY_DECLVAR_CONTEXT(interface, ifp); + babel_interface_nfo *babel_ifp; +- int interval; +- +- interval = strtoul(argv[2]->arg, NULL, 10); + + babel_ifp = babel_get_if_nfo(ifp); + assert (babel_ifp != NULL); + +- babel_ifp->hello_interval = interval; ++ babel_ifp->hello_interval = no ? ++ BABEL_DEFAULT_HELLO_INTERVAL : hello_interval; + return CMD_SUCCESS; + } + + /* [Interface Command]. */ +-DEFUN (babel_set_update_interval, ++DEFPY (babel_set_update_interval, + babel_set_update_interval_cmd, +- "babel update-interval (20-655340)", ++ "[no] babel update-interval (20-655340)", ++ NO_STR + "Babel interface commands\n" + "Time between scheduled updates\n" + "Milliseconds\n") + { + VTY_DECLVAR_CONTEXT(interface, ifp); + babel_interface_nfo *babel_ifp; +- int interval; +- +- interval = strtoul(argv[2]->arg, NULL, 10); + + babel_ifp = babel_get_if_nfo(ifp); + assert (babel_ifp != NULL); + +- babel_ifp->update_interval = interval; ++ babel_ifp->update_interval = no ? ++ BABEL_DEFAULT_UPDATE_INTERVAL : update_interval; + return CMD_SUCCESS; + } + +-DEFUN (babel_set_rxcost, ++DEFPY (babel_set_rxcost, + babel_set_rxcost_cmd, +- "babel rxcost (1-65534)", ++ "[no] babel rxcost (1-65534)", ++ NO_STR + "Babel interface commands\n" + "Rxcost multiplier\n" + "Units\n") + { + VTY_DECLVAR_CONTEXT(interface, ifp); + babel_interface_nfo *babel_ifp; +- int rxcost; +- +- rxcost = strtoul(argv[2]->arg, NULL, 10); + + babel_ifp = babel_get_if_nfo(ifp); + assert (babel_ifp != NULL); + ++ if (no) ++ rxcost = CHECK_FLAG(babel_ifp->flags, BABEL_IF_WIRED) ? ++ BABEL_DEFAULT_RXCOST_WIRED : BABEL_DEFAULT_RXCOST_WIRELESS; ++ + babel_ifp->cost = rxcost; + return CMD_SUCCESS; + } + +-DEFUN (babel_set_rtt_decay, ++DEFPY (babel_set_rtt_decay, + babel_set_rtt_decay_cmd, +- "babel rtt-decay (1-256)", ++ "[no] babel rtt-decay (1-256)", ++ NO_STR + "Babel interface commands\n" + "Decay factor for exponential moving average of RTT samples\n" + "Units of 1/256\n") + { + VTY_DECLVAR_CONTEXT(interface, ifp); + babel_interface_nfo *babel_ifp; +- int decay; +- +- decay = strtoul(argv[2]->arg, NULL, 10); + + babel_ifp = babel_get_if_nfo(ifp); + assert (babel_ifp != NULL); + +- babel_ifp->rtt_decay = decay; ++ babel_ifp->rtt_decay = no ? BABEL_DEFAULT_RTT_DECAY : rtt_decay; + return CMD_SUCCESS; + } + +-DEFUN (babel_set_rtt_min, ++DEFPY (babel_set_rtt_min, + babel_set_rtt_min_cmd, +- "babel rtt-min (1-65535)", ++ "[no] babel rtt-min (1-65535)", ++ NO_STR + "Babel interface commands\n" + "Minimum RTT starting for increasing cost\n" + "Milliseconds\n") + { + VTY_DECLVAR_CONTEXT(interface, ifp); + babel_interface_nfo *babel_ifp; +- int rtt; +- +- rtt = strtoul(argv[2]->arg, NULL, 10); + + babel_ifp = babel_get_if_nfo(ifp); + assert (babel_ifp != NULL); + + /* The value is entered in milliseconds but stored as microseconds. */ +- babel_ifp->rtt_min = rtt * 1000; ++ babel_ifp->rtt_min = no ? BABEL_DEFAULT_RTT_MIN : rtt_min * 1000; + return CMD_SUCCESS; + } + +-DEFUN (babel_set_rtt_max, ++DEFPY (babel_set_rtt_max, + babel_set_rtt_max_cmd, +- "babel rtt-max (1-65535)", ++ "[no] babel rtt-max (1-65535)", ++ NO_STR + "Babel interface commands\n" + "Maximum RTT\n" + "Milliseconds\n") + { + VTY_DECLVAR_CONTEXT(interface, ifp); + babel_interface_nfo *babel_ifp; +- int rtt; +- +- rtt = strtoul(argv[2]->arg, NULL, 10); + + babel_ifp = babel_get_if_nfo(ifp); + assert (babel_ifp != NULL); + + /* The value is entered in milliseconds but stored as microseconds. */ +- babel_ifp->rtt_max = rtt * 1000; ++ babel_ifp->rtt_max = no ? BABEL_DEFAULT_RTT_MAX : rtt_max * 1000; + return CMD_SUCCESS; + } + +-DEFUN (babel_set_max_rtt_penalty, ++DEFPY (babel_set_max_rtt_penalty, + babel_set_max_rtt_penalty_cmd, +- "babel max-rtt-penalty (0-65535)", ++ "[no] babel max-rtt-penalty (0-65535)", ++ NO_STR + "Babel interface commands\n" + "Maximum additional cost due to RTT\n" + "Milliseconds\n") + { + VTY_DECLVAR_CONTEXT(interface, ifp); + babel_interface_nfo *babel_ifp; +- int penalty; +- +- penalty = strtoul(argv[2]->arg, NULL, 10); + + babel_ifp = babel_get_if_nfo(ifp); + assert (babel_ifp != NULL); + +- babel_ifp->max_rtt_penalty = penalty; ++ babel_ifp->max_rtt_penalty = no ? ++ BABEL_DEFAULT_MAX_RTT_PENALTY : max_rtt_penalty; + return CMD_SUCCESS; + } + +-DEFUN (babel_set_enable_timestamps, ++DEFPY (babel_set_enable_timestamps, + babel_set_enable_timestamps_cmd, +- "babel enable-timestamps", +- "Babel interface commands\n" +- "Enable timestamps\n") +-{ +- VTY_DECLVAR_CONTEXT(interface, ifp); +- babel_interface_nfo *babel_ifp; +- +- babel_ifp = babel_get_if_nfo(ifp); +- assert (babel_ifp != NULL); +- +- babel_ifp->flags |= BABEL_IF_TIMESTAMPS; +- return CMD_SUCCESS; +-} +- +-DEFUN (no_babel_set_enable_timestamps, +- no_babel_set_enable_timestamps_cmd, +- "no babel enable-timestamps", ++ "[no] babel enable-timestamps", + NO_STR + "Babel interface commands\n" +- "Disable timestamps\n") ++ "Enable timestamps\n") + { + VTY_DECLVAR_CONTEXT(interface, ifp); + babel_interface_nfo *babel_ifp; + + babel_ifp = babel_get_if_nfo(ifp); + assert (babel_ifp != NULL); +- +- babel_ifp->flags &= ~BABEL_IF_TIMESTAMPS; ++ if (!no) ++ SET_FLAG(babel_ifp->flags, BABEL_IF_TIMESTAMPS); ++ else ++ UNSET_FLAG(babel_ifp->flags, BABEL_IF_TIMESTAMPS); + return CMD_SUCCESS; + } + +-DEFUN (babel_set_channel, ++DEFPY (babel_set_channel, + babel_set_channel_cmd, +- "babel channel (1-254)", +- "Babel interface commands\n" +- "Channel number for diversity routing\n" +- "Number\n") +-{ +- VTY_DECLVAR_CONTEXT(interface, ifp); +- babel_interface_nfo *babel_ifp; +- int channel; +- +- channel = strtoul(argv[2]->arg, NULL, 10); +- +- babel_ifp = babel_get_if_nfo(ifp); +- assert (babel_ifp != NULL); +- +- babel_ifp->channel = channel; +- return CMD_SUCCESS; +-} +- +-DEFUN (babel_set_channel_interfering, +- babel_set_channel_interfering_cmd, +- "babel channel interfering", ++ "[no] babel channel <(1-254)$ch|interfering$interfering|" ++ "noninterfering$noninterfering>", ++ NO_STR + "Babel interface commands\n" + "Channel number for diversity routing\n" +- "Mark channel as interfering\n") ++ "Number\n" ++ "Mark channel as interfering\n" ++ "Mark channel as noninterfering\n" ++ ) + { + VTY_DECLVAR_CONTEXT(interface, ifp); + babel_interface_nfo *babel_ifp; +@@ -585,24 +541,15 @@ DEFUN (babel_set_channel_interfering, + babel_ifp = babel_get_if_nfo(ifp); + assert (babel_ifp != NULL); + +- babel_ifp->channel = BABEL_IF_CHANNEL_INTERFERING; +- return CMD_SUCCESS; +-} +- +-DEFUN (babel_set_channel_noninterfering, +- babel_set_channel_noninterfering_cmd, +- "babel channel noninterfering", +- "Babel interface commands\n" +- "Channel number for diversity routing\n" +- "Mark channel as noninterfering\n") +-{ +- VTY_DECLVAR_CONTEXT(interface, ifp); +- babel_interface_nfo *babel_ifp; +- +- babel_ifp = babel_get_if_nfo(ifp); +- assert (babel_ifp != NULL); ++ if (no) ++ ch = CHECK_FLAG(babel_ifp->flags, BABEL_IF_WIRED) ? ++ BABEL_IF_CHANNEL_NONINTERFERING : BABEL_IF_CHANNEL_INTERFERING; ++ else if (interfering) ++ ch = BABEL_IF_CHANNEL_INTERFERING; ++ else if (noninterfering) ++ ch = BABEL_IF_CHANNEL_NONINTERFERING; + +- babel_ifp->channel = BABEL_IF_CHANNEL_NONINTERFERING; ++ babel_ifp->channel = ch; + return CMD_SUCCESS; + } + +@@ -1239,7 +1186,6 @@ babel_if_init(void) + install_element(BABEL_NODE, &babel_network_cmd); + install_element(BABEL_NODE, &no_babel_network_cmd); + install_element(INTERFACE_NODE, &babel_split_horizon_cmd); +- install_element(INTERFACE_NODE, &no_babel_split_horizon_cmd); + install_element(INTERFACE_NODE, &babel_set_wired_cmd); + install_element(INTERFACE_NODE, &babel_set_wireless_cmd); + install_element(INTERFACE_NODE, &babel_set_hello_interval_cmd); +@@ -1251,9 +1197,6 @@ babel_if_init(void) + install_element(INTERFACE_NODE, &babel_set_rtt_max_cmd); + install_element(INTERFACE_NODE, &babel_set_max_rtt_penalty_cmd); + install_element(INTERFACE_NODE, &babel_set_enable_timestamps_cmd); +- install_element(INTERFACE_NODE, &no_babel_set_enable_timestamps_cmd); +- install_element(INTERFACE_NODE, &babel_set_channel_interfering_cmd); +- install_element(INTERFACE_NODE, &babel_set_channel_noninterfering_cmd); + + /* "show babel ..." commands */ + install_element(VIEW_NODE, &show_babel_interface_cmd); +diff --git a/babeld/babeld.c b/babeld/babeld.c +index dfdc924cb..34e1a4318 100644 +--- a/babeld/babeld.c ++++ b/babeld/babeld.c +@@ -47,6 +47,10 @@ THE SOFTWARE. + #include "babel_zebra.h" + #include "babel_errors.h" + ++#ifndef VTYSH_EXTRACT_PL ++#include "babeld/babeld_clippy.c" ++#endif ++ + DEFINE_MGROUP(BABELD, "babeld"); + DEFINE_MTYPE_STATIC(BABELD, BABEL, "Babel Structure"); + +@@ -662,50 +666,42 @@ DEFUN (no_babel_diversity, + } + + /* [Babel Command] */ +-DEFUN (babel_diversity_factor, ++DEFPY (babel_diversity_factor, + babel_diversity_factor_cmd, +- "babel diversity-factor (1-256)", ++ "[no] babel diversity-factor (1-256)$factor", ++ NO_STR + "Babel commands\n" + "Set the diversity factor.\n" + "Factor in units of 1/256.\n") + { +- int factor; +- +- factor = strtoul(argv[2]->arg, NULL, 10); +- +- diversity_factor = factor; ++ diversity_factor = no ? BABEL_DEFAULT_DIVERSITY_FACTOR : factor; + return CMD_SUCCESS; + } + + /* [Babel Command] */ +-DEFUN (babel_set_resend_delay, ++DEFPY (babel_set_resend_delay, + babel_set_resend_delay_cmd, +- "babel resend-delay (20-655340)", ++ "[no] babel resend-delay (20-655340)$delay", ++ NO_STR + "Babel commands\n" + "Time before resending a message\n" + "Milliseconds\n") + { +- int interval; +- +- interval = strtoul(argv[2]->arg, NULL, 10); +- +- resend_delay = interval; ++ resend_delay = no ? BABEL_DEFAULT_RESEND_DELAY : delay; + return CMD_SUCCESS; + } + + /* [Babel Command] */ +-DEFUN (babel_set_smoothing_half_life, ++DEFPY (babel_set_smoothing_half_life, + babel_set_smoothing_half_life_cmd, +- "babel smoothing-half-life (0-65534)", ++ "[no] babel smoothing-half-life (0-65534)$seconds", ++ NO_STR + "Babel commands\n" + "Smoothing half-life\n" + "Seconds (0 to disable)\n") + { +- int seconds; +- +- seconds = strtoul(argv[2]->arg, NULL, 10); +- +- change_smoothing_half_life(seconds); ++ change_smoothing_half_life(no ? BABEL_DEFAULT_SMOOTHING_HALF_LIFE ++ : seconds); + return CMD_SUCCESS; + } + +diff --git a/babeld/subdir.am b/babeld/subdir.am +index 856cbd13e..6183c8c83 100644 +--- a/babeld/subdir.am ++++ b/babeld/subdir.am +@@ -48,4 +48,8 @@ noinst_HEADERS += \ + babeld/xroute.h \ + # end + ++clippy_scan += \ ++ babeld/babel_interface.c \ ++ babeld/babeld.c ++ + babeld_babeld_LDADD = lib/libfrr.la $(LIBCAP) +-- +2.37.1 (Apple Git-137.1) + |