]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/if.c
Merge pull request #2944 from thbtcllt/master
[mirror_frr.git] / lib / if.c
index a03c9da6f91e5aa6329e662206909d10e758e6aa..2f2073c0a12acf3435579ea284336d312b722ae9 100644 (file)
--- a/lib/if.c
+++ b/lib/if.c
@@ -371,37 +371,47 @@ struct interface *if_lookup_prefix(struct prefix *prefix, vrf_id_t vrf_id)
    one. */
 struct interface *if_get_by_name(const char *name, vrf_id_t vrf_id, int vty)
 {
-       struct interface *ifp;
+       struct interface *ifp = NULL;
 
-       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 (vrf_is_mapped_on_netns(vrf_lookup_by_id(vrf_id))) {
+               ifp = if_lookup_by_name(name, vrf_id);
+               if (ifp)
+                       return ifp;
+               if (vty) {
+                       /* If the interface command was entered in vty without a
+                        * VRF (passed as VRF_DEFAULT), search an interface with
+                        * this name in all VRs
+                        */
+                       if (vrf_id == VRF_DEFAULT)
+                               return if_lookup_by_name_all_vrf(name);
+                       return NULL;
+               }
                return if_create(name, vrf_id);
-       if (vty) {
-               if (vrf_id == VRF_DEFAULT)
+       }
+       /* vrf is based on vrf-lite */
+       ifp = if_lookup_by_name_all_vrf(name);
+       if (ifp) {
+               if (ifp->vrf_id == vrf_id)
                        return ifp;
-               return NULL;
+               /* 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;
+               }
+               /* 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;
        }
-       /* 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_lookup_by_id(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;
+       return if_create(name, vrf_id);
 }
 
 void if_set_index(struct interface *ifp, ifindex_t ifindex)