]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: create interface even if name is the same
authorPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 19 Dec 2017 11:44:44 +0000 (12:44 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 27 Feb 2018 10:11:24 +0000 (11:11 +0100)
For supporting vrf based on namespaces, it is possible that an interface
with the same index is present. This is the case for loopback
interfaces. For that, for each query, if the interface is not found
, matching the vrf identifier, then a new interface is created, when the
backens for VRF is NETNS.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
lib/if.c

index 12d123a8fae033867bc29a3c68e1383d6292b7d0..3a83de46ae9743e1cb04dc7f3564c0d5096d591b 100644 (file)
--- a/lib/if.c
+++ b/lib/if.c
@@ -384,29 +384,35 @@ struct interface *if_get_by_name(const char *name, vrf_id_t vrf_id, int vty)
 {
        struct interface *ifp;
 
+       ifp = if_lookup_by_name(name, vrf_id);
+       if (ifp)
+               return ifp;
+       /* Not Found on same VRF. If the interface command
+        * was entered in vty without a VRF (passed as VRF_DEFAULT),
+        * accept the ifp we found. If a vrf was entered and there is
+        * a mismatch, reject it if from vty.
+        */
        ifp = if_lookup_by_name_all_vrf(name);
-       if (ifp) {
-               if (ifp->vrf_id == vrf_id)
-                       return ifp;
-
-               /* Found a match on a different VRF. If the interface command
-                * was entered in vty without a VRF (passed as VRF_DEFAULT),
-                * accept the ifp we found. If a vrf was entered and there is
-                * a mismatch, reject it if from vty. If it came from the kernel
-                * or by way of zclient, believe it and update the ifp
-                * accordingly.
-                */
-               if (vty) {
-                       if (vrf_id == VRF_DEFAULT)
-                               return ifp;
-                       return NULL;
-               } else {
-                       if_update_to_new_vrf(ifp, vrf_id);
+       if (!ifp)
+               return if_create(name, vrf_id);
+       if (vty) {
+               if (vrf_id == VRF_DEFAULT)
                        return ifp;
-               }
+               return NULL;
        }
-
-       return if_create(name, vrf_id);
+       /* if vrf backend uses NETNS, then
+        * this should not be considered as an update
+        * then create the new interface
+        */
+       if (ifp->vrf_id != vrf_id &&
+           vrf_is_mapped_on_netns(vrf_id))
+               return if_create(name, vrf_id);
+       /* If it came from the kernel
+        * or by way of zclient, believe it and update
+        * the ifp accordingly.
+        */
+       if_update_to_new_vrf(ifp, vrf_id);
+       return ifp;
 }
 
 void if_set_index(struct interface *ifp, ifindex_t ifindex)