summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2009-10-28 22:39:24 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2009-10-28 22:39:24 +0100
commit9d4d38d1a5d67f5485d2b2fa439c879583dfdcb0 (patch)
tree40e1be3e39126675d4d66c7ceddca4cc0d337497
parent9727681a38d3a7c474892e167c0e5a4e0cfac844 (diff)
downloadbird-9d4d38d1a5d67f5485d2b2fa439c879583dfdcb0.tar
bird-9d4d38d1a5d67f5485d2b2fa439c879583dfdcb0.zip
Fixes some problems related to link-local routes in KRT interface.
-rw-r--r--proto/ospf/lsupd.c2
-rw-r--r--sysdep/linux/netlink/netlink.c11
2 files changed, 9 insertions, 4 deletions
diff --git a/proto/ospf/lsupd.c b/proto/ospf/lsupd.c
index cb79461..5278f1b 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 0f7b707..6cfb0ba 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
{