summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorPhilippe Guibert <philippe.guibert@6wind.com>2019-02-07 14:55:06 +0100
committerPhilippe Guibert <philippe.guibert@6wind.com>2019-02-11 13:47:04 +0100
commit72261ecd22495d23ce80a699bb799694981fffe8 (patch)
tree4a172dc311effa8af50cdabdfbc989f36a0217b5 /lib
parentMerge pull request #3770 from donaldsharp/detailed_debugs (diff)
downloadfrr-72261ecd22495d23ce80a699bb799694981fffe8.tar.xz
frr-72261ecd22495d23ce80a699bb799694981fffe8.zip
lib: interface handling where zebra not yet ready
other daemons need to sync with zebra to get to know which vrf backend is available. in that time, there may be interface configuration available. in that specific case, the vrf backend returned is not known. A specific return value is sent back. This will be useful to know which specific algorithm to apply. Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/if.c1
-rw-r--r--lib/vrf.c4
-rw-r--r--lib/vrf.h5
3 files changed, 8 insertions, 2 deletions
diff --git a/lib/if.c b/lib/if.c
index 0fd65da03..6ae75939e 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -1281,6 +1281,7 @@ static int lib_interface_create(enum nb_event event,
vrf->name);
return NB_ERR_VALIDATION;
}
+
if (vrf_get_backend() == VRF_BACKEND_VRF_LITE) {
ifp = if_lookup_by_name_all_vrf(ifname);
if (ifp && ifp->vrf_id != vrf->vrf_id) {
diff --git a/lib/vrf.c b/lib/vrf.c
index f9f14822c..c0dd7f5cf 100644
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -56,6 +56,7 @@ struct vrf_id_head vrfs_by_id = RB_INITIALIZER(&vrfs_by_id);
struct vrf_name_head vrfs_by_name = RB_INITIALIZER(&vrfs_by_name);
static int vrf_backend;
+static int vrf_backend_configured;
static struct zebra_privs_t *vrf_daemon_privs;
static char vrf_default_name[VRF_NAMSIZ] = VRF_DEFAULT_NAME_INTERNAL;
@@ -613,12 +614,15 @@ int vrf_is_backend_netns(void)
int vrf_get_backend(void)
{
+ if (!vrf_backend_configured)
+ return VRF_BACKEND_UNKNOWN;
return vrf_backend;
}
void vrf_configure_backend(int vrf_backend_netns)
{
vrf_backend = vrf_backend_netns;
+ vrf_backend_configured = 1;
}
int vrf_handler_create(struct vty *vty, const char *vrfname,
diff --git a/lib/vrf.h b/lib/vrf.h
index e80796f48..1a850f218 100644
--- a/lib/vrf.h
+++ b/lib/vrf.h
@@ -97,8 +97,9 @@ RB_PROTOTYPE(vrf_name_head, vrf, name_entry, vrf_name_compare)
DECLARE_QOBJ_TYPE(vrf)
/* Allow VRF with netns as backend */
-#define VRF_BACKEND_VRF_LITE 0
-#define VRF_BACKEND_NETNS 1
+#define VRF_BACKEND_VRF_LITE 0
+#define VRF_BACKEND_NETNS 1
+#define VRF_BACKEND_UNKNOWN 2
extern struct vrf_id_head vrfs_by_id;
extern struct vrf_name_head vrfs_by_name;