From 691057f03310e712428e19214ae48462d0f258e1 Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Wed, 26 May 2010 16:09:22 +0200 Subject: Support loopback/dummy addresses. --- proto/ospf/iface.c | 4 ++++ sysdep/linux/netlink/netlink.c | 15 +++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c index ae7b80c..bef3112 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 365d4a9..a10a2e9 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 { -- cgit v1.2.3