summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorIgor Ryzhov <idryzhov@gmail.com>2024-12-27 21:33:39 +0200
committerIgor Ryzhov <idryzhov@gmail.com>2025-01-15 23:38:27 +0200
commit300f8dbda4bc7efdab90809fbff5f9799c0ec2aa (patch)
tree72a4cdba181d9c90528f098d41dee08e862d2b6c /lib
parent6f214d97d1a7883ea8d5866e10db31daffa0325a (diff)
lib: introduce global -w option for VRF netns backend
Current -n option is only for zebra and mgmtd. All other daemons receive the VRF backend configuration from zebra upon connection to it. This leads to a potential race condition - daemons need to know the backend before they start reading their config, but they can be not connected to zebra yet at this point. As the VRF backend cannot change during runtime, let's introduce a new global -w option for setting netns backend, to make sure that all daemons know their VRF backend immediately after start. The reason for introducing a new option instead of making -n global is that ospfd already uses -n for another purposes. Signed-off-by: Igor Ryzhov <idryzhov@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/libfrr.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/libfrr.c b/lib/libfrr.c
index d1a9f0b1cb..261d3aa87e 100644
--- a/lib/libfrr.c
+++ b/lib/libfrr.c
@@ -108,6 +108,9 @@ static const struct option lo_always[] = {
{ "module", no_argument, NULL, 'M' },
{ "profile", required_argument, NULL, 'F' },
{ "pathspace", required_argument, NULL, 'N' },
+#ifdef HAVE_NETLINK
+ { "vrfwnetns", no_argument, NULL, 'w' },
+#endif
{ "vrfdefaultname", required_argument, NULL, 'o' },
{ "graceful_restart", optional_argument, NULL, 'K' },
{ "vty_socket", required_argument, NULL, OPTION_VTYSOCK },
@@ -120,6 +123,9 @@ static const struct option lo_always[] = {
{ NULL }
};
static const struct optspec os_always = {
+#ifdef HAVE_NETLINK
+ "w"
+#endif
"hvdM:F:N:o:K::",
" -h, --help Display this help and exit\n"
" -v, --version Print program version\n"
@@ -127,6 +133,9 @@ static const struct optspec os_always = {
" -M, --module Load specified module\n"
" -F, --profile Use specified configuration profile\n"
" -N, --pathspace Insert prefix into config & socket paths\n"
+#ifdef HAVE_NETLINK
+ " -w, --vrfwnetns Use network namespaces for VRFs\n"
+#endif
" -o, --vrfdefaultname Set default VRF name.\n"
" -K, --graceful_restart FRR starting in Graceful Restart mode, with optional route-cleanup timer\n"
" --vty_socket Override vty socket path\n"
@@ -516,6 +525,11 @@ static int frr_opt(int opt)
snprintf(frr_zclientpath, sizeof(frr_zclientpath),
ZAPI_SOCK_NAME);
break;
+#ifdef HAVE_NETLINK
+ case 'w':
+ vrf_configure_backend(VRF_BACKEND_NETNS);
+ break;
+#endif
case 'o':
vrf_set_default_name(optarg);
break;