summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--proto/ospf/iface.c4
-rw-r--r--sysdep/linux/netlink/netlink.c15
2 files changed, 15 insertions, 4 deletions
diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c
index ae7b80c9..bef31125 100644
--- a/proto/ospf/iface.c
+++ b/proto/ospf/iface.c
@@ -453,6 +453,10 @@ ospf_iface_new(struct proto_ospf *po, struct iface *iface, struct ifa *addr,
else
ifa->type = ip->type;
+ /* a loopback/dummy address */
+ if ((addr->pxlen == MAX_PREFIX_LENGTH) && ipa_zero(addr->opposite))
+ ifa->stub = 1;
+
#ifdef OSPFv2
if ((ifa->type != OSPF_IT_PTP) && (ifa->type != OSPF_IT_VLINK) &&
(addr->flags & IA_UNNUMBERED))
diff --git a/sysdep/linux/netlink/netlink.c b/sysdep/linux/netlink/netlink.c
index 365d4a95..a10a2e9f 100644
--- a/sysdep/linux/netlink/netlink.c
+++ b/sysdep/linux/netlink/netlink.c
@@ -382,10 +382,17 @@ nl_parse_addr(struct nlmsghdr *h)
}
if (i->ifa_prefixlen == BITS_PER_IP_ADDRESS)
{
- ifa.flags |= IA_UNNUMBERED;
- memcpy(&ifa.opposite, RTA_DATA(a[IFA_ADDRESS]), sizeof(ifa.opposite));
- ipa_ntoh(ifa.opposite);
- ifa.prefix = ifa.brd = ifa.opposite;
+ ip_addr addr;
+ memcpy(&addr, RTA_DATA(a[IFA_ADDRESS]), sizeof(addr));
+ ipa_ntoh(addr);
+ ifa.prefix = ifa.brd = addr;
+
+ /* It is either a peer address, or loopback/dummy address */
+ if (!ipa_equal(ifa.ip, addr))
+ {
+ ifa.flags |= IA_UNNUMBERED;
+ ifa.opposite = addr;
+ }
}
else
{