return if_lookup_address_vrf (matchaddr, family, VRF_DEFAULT);
}
-/* Lookup anchor interface by IPv4 address. */
-struct connected *
-if_anchor_lookup_by_address (struct in_addr src)
-{
- struct listnode *node;
- struct listnode *cnode;
- struct interface *ifp;
- struct prefix *p;
- struct connected *c;
-
- for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
- {
- for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, c))
- {
- if (CHECK_FLAG(c->flags, ZEBRA_IFA_UNNUMBERED) ||
- !CHECK_FLAG(c->conf, ZEBRA_IFC_REAL))
- continue;
-
- p = c->address;
-
- if (p && p->family == AF_INET)
- {
- if (IPV4_ADDR_SAME (&p->u.prefix4, &src))
- return c;
- }
- }
- }
- return NULL;
-}
-
/* Lookup interface by prefix */
struct interface *
if_lookup_prefix_vrf (struct prefix *prefix, vrf_id_t vrf_id)
Note: destination may be NULL if ZEBRA_IFA_PEER is not set. */
struct prefix *destination;
- /* A list of unnumbered IFCs borrowing the address from me */
- struct list *unnumbered;
-
- /* Pointer to the anchor IFC if I'm unnumbered */
- struct connected *anchor;
-
/* Label for Linux 2.2.X and upper. */
char *label;
};
extern struct interface *if_lookup_exact_address (void *matchaddr, int family);
extern struct interface *if_lookup_address (void *matchaddr, int family);
extern struct interface *if_lookup_prefix (struct prefix *prefix);
-extern struct connected *if_anchor_lookup_by_address (struct in_addr src);
extern struct interface *if_create_vrf (const char *name, int namelen,
vrf_id_t vrf_id);
if (!ifc)
return;
- if (ifc->address->family == AF_INET)
+ if (!if_is_loopback(ifp) && ifc->address->family == AF_INET)
{
- if ((ifc->anchor = if_anchor_lookup_by_address(ifc->address->u.prefix4)))
- {
- /* found an anchor, so I'm unnumbered */
+ if (ifc->address->prefixlen == 32)
SET_FLAG (ifc->flags, ZEBRA_IFA_UNNUMBERED);
- listnode_add (ifc->anchor->unnumbered, ifc);
- }
else
- {
- /* I'm numbered */
UNSET_FLAG (ifc->flags, ZEBRA_IFA_UNNUMBERED);
- ifc->unnumbered = list_new();
- }
}
listnode_add (ifp->connected, ifc);
rib_update_static (ifp->vrf_id);
}
-void
-connected_delete_ipv4_unnumbered (struct connected *ifc)
-{
- struct connected *new_anchor, *iter;
- struct listnode *node;
-
- if (CHECK_FLAG (ifc->flags, ZEBRA_IFA_UNNUMBERED))
- {
- listnode_delete (ifc->anchor->unnumbered, ifc);
- ifc->anchor = NULL;
- }
- else /* I'm a numbered interface */
- {
- if (!list_isempty (ifc->unnumbered))
- {
- new_anchor = listgetdata (listhead (ifc->unnumbered));
- new_anchor->unnumbered = ifc->unnumbered;
- listnode_delete (new_anchor->unnumbered, new_anchor);
- new_anchor->anchor = NULL;
-
- /* new_anchor changed from unnumbered to numbered, notify clients */
- zebra_interface_address_delete_update (new_anchor->ifp, new_anchor);
- UNSET_FLAG (new_anchor->flags, ZEBRA_IFA_UNNUMBERED);
- zebra_interface_address_add_update (new_anchor->ifp, new_anchor);
-
- for (ALL_LIST_ELEMENTS_RO(new_anchor->unnumbered, node, iter))
- iter->anchor = new_anchor;
- }
- else
- {
- list_free (ifc->unnumbered);
- ifc->unnumbered = NULL;
- }
- }
-}
-
/* Delete connected IPv4 route to the interface. */
void
connected_delete_ipv4 (struct interface *ifp, int flags, struct in_addr *addr,
if (! ifc)
return;
- connected_delete_ipv4_unnumbered (ifc);
-
connected_withdraw (ifc);
if (IS_ZEBRA_DEBUG_RIB)