lib: create interface even if name is the same

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>
This commit is contained in:
Philippe Guibert 2017-12-19 12:44:44 +01:00
parent 0439cb9d9e
commit e9e9b1150f

View File

@ -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)
if (!ifp)
return if_create(name, vrf_id);
if (vty) {
if (vrf_id == VRF_DEFAULT)
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);
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)