From 9d4d38d1a5d67f5485d2b2fa439c879583dfdcb0 Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Wed, 28 Oct 2009 22:39:24 +0100 Subject: [PATCH] Fixes some problems related to link-local routes in KRT interface. --- proto/ospf/lsupd.c | 2 -- sysdep/linux/netlink/netlink.c | 11 +++++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/proto/ospf/lsupd.c b/proto/ospf/lsupd.c index cb794617..5278f1b2 100644 --- a/proto/ospf/lsupd.c +++ b/proto/ospf/lsupd.c @@ -457,8 +457,6 @@ ospf_lsupd_receive(struct ospf_packet *ps_i, struct ospf_iface *ifa, /* pg 143 (1) */ chsum = lsa->checksum; - log(L_WARN "Checking rcv %R %R %d (len %d)", ntohl(lsa->id), ntohl(lsa->rt), ntoht(lsa->type), ntohs(lsa->length)); - buf_dump("RCV", lsa, ntohs(lsa->length)); if (chsum != lsasum_check(lsa, NULL)) { log(L_WARN "Received bad lsa checksum from %I: %x %x", n->ip, chsum, lsa->checksum); diff --git a/sysdep/linux/netlink/netlink.c b/sysdep/linux/netlink/netlink.c index 0f7b7070..6cfb0ba6 100644 --- a/sysdep/linux/netlink/netlink.c +++ b/sysdep/linux/netlink/netlink.c @@ -686,16 +686,23 @@ nl_parse_route(struct nlmsghdr *h, int scan) } if (a[RTA_GATEWAY]) { + struct iface *ifa = if_find_by_index(oif); neighbor *ng; ra.dest = RTD_ROUTER; memcpy(&ra.gw, RTA_DATA(a[RTA_GATEWAY]), sizeof(ra.gw)); ipa_ntoh(ra.gw); - ng = neigh_find(&p->p, &ra.gw, 0); + ng = neigh_find2(&p->p, &ra.gw, ifa, 0); if (ng && ng->scope) + { + if (ng->iface != ifa) + log(L_WARN "KRT: Route with unexpected iface for %I/%d", net->n.prefix, net->n.pxlen); ra.iface = ng->iface; + } else - /* FIXME: Remove this warning? Handle it somehow... */ + { log(L_WARN "Kernel told us to use non-neighbor %I for %I/%d", ra.gw, net->n.prefix, net->n.pxlen); + return; + } } else {