summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2009-12-15 00:30:07 +0100
committerOndrej Zajicek <santiago@crfreenet.org>2009-12-15 00:30:07 +0100
commitf2d7da742bd683b8eaecb1be8e3b04618171c796 (patch)
tree7dc5020885bb4b3db426a23e077cc334b4ef2914
parent13a7395704deeeff2d86910d8bcf9a6f32a7b207 (diff)
downloadbird-f2d7da742bd683b8eaecb1be8e3b04618171c796.tar
bird-f2d7da742bd683b8eaecb1be8e3b04618171c796.zip
Fixes export of routes with link-local gw.
-rw-r--r--proto/bgp/attrs.c6
-rw-r--r--proto/ospf/topology.c11
2 files changed, 9 insertions, 8 deletions
diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c
index 7b49bdf..801fe10 100644
--- a/proto/bgp/attrs.c
+++ b/proto/bgp/attrs.c
@@ -877,10 +877,12 @@ bgp_create_attrs(struct bgp_proto *p, rte *e, ea_list **attrs, struct linpool *p
z = bgp_set_attr_wa(ea->attrs+2, pool, BA_NEXT_HOP, NEXT_HOP_LENGTH);
if (p->cf->next_hop_self ||
rta->dest != RTD_ROUTER ||
- (!p->is_internal && (e->attrs->iface != p->neigh->iface)))
+ ipa_equal(e->attrs->gw, IPA_NONE) ||
+ ipa_has_link_scope(rta->gw) ||
+ (!p->is_internal && (rta->iface != p->neigh->iface)))
set_next_hop(z, p->source_addr);
else
- set_next_hop(z, e->attrs->gw);
+ set_next_hop(z, rta->gw);
bgp_set_attr(ea->attrs+3, BA_LOCAL_PREF, 0);
diff --git a/proto/ospf/topology.c b/proto/ospf/topology.c
index 4665681..3ca5e77 100644
--- a/proto/ospf/topology.c
+++ b/proto/ospf/topology.c
@@ -899,12 +899,11 @@ originate_ext_lsa_body(net *n, rte *e, u16 *length, struct proto_ospf *po,
int size = sizeof(struct ospf_lsa_ext);
u32 *buf;
- if (!ipa_equal(e->attrs->gw, IPA_NONE))
- {
- /* FIXME: check for link-local in OSPFv3 ? */
- if (ospf_iface_find((struct proto_ospf *) p, e->attrs->iface) != NULL)
- gw = 1;
- }
+ if ((e->attrs->dest == RTD_ROUTER) &&
+ !ipa_equal(e->attrs->gw, IPA_NONE) &&
+ !ipa_has_link_scope(e->attrs->gw) &&
+ (ospf_iface_find((struct proto_ospf *) p, e->attrs->iface) != NULL))
+ gw = 1;
#ifdef OSPFv3
size += IPV6_PREFIX_SPACE(n->n.pxlen);