summaryrefslogtreecommitdiff
path: root/packages/frr
diff options
context:
space:
mode:
authorYuxiang Zhu <vfreex@gmail.com>2023-02-07 01:23:46 +0800
committerYuxiang Zhu <vfreex@gmail.com>2023-02-07 01:25:39 +0800
commit2958ae76f5658a817d7fdd0fcc44a55cf4d3e841 (patch)
tree08218d61ed09c251fdd12e94e863b33275d277f5 /packages/frr
parent2767ac346e4d1a3a6efcd8a0283af4e36c07a9e6 (diff)
downloadvyos-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.patch37
-rw-r--r--packages/frr/patches/0002-babeld-Add-missing-no-commands.patch526
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)
+