summaryrefslogtreecommitdiffstats
path: root/proto/bgp/attrs.c
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2009-04-28 18:11:56 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2009-04-28 18:11:56 +0200
commitad440a570b37e8674ef35f3a18df48f0eb2579eb (patch)
treef3d0f586a5d9fa21fd1a64e8a5a96c9ca2b58771 /proto/bgp/attrs.c
parenta6ee026693a9c24c71dcf846abd32508782e0249 (diff)
downloadbird-ad440a570b37e8674ef35f3a18df48f0eb2579eb.tar
bird-ad440a570b37e8674ef35f3a18df48f0eb2579eb.zip
Fixes handling of 'next hop self' and 'source address' configuration
options.
Diffstat (limited to 'proto/bgp/attrs.c')
-rw-r--r--proto/bgp/attrs.c11
1 files changed, 3 insertions, 8 deletions
diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c
index a015c2b..9a247de 100644
--- a/proto/bgp/attrs.c
+++ b/proto/bgp/attrs.c
@@ -790,12 +790,7 @@ bgp_create_attrs(struct bgp_proto *p, rte *e, ea_list **attrs, struct linpool *p
if (p->cf->next_hop_self ||
!p->is_internal ||
rta->dest != RTD_ROUTER)
- {
- if (ipa_nonzero(p->cf->source_addr))
- *(ip_addr *)z = p->cf->source_addr;
- else
- *(ip_addr *)z = p->local_addr;
- }
+ *(ip_addr *)z = p->source_addr;
else
*(ip_addr *)z = e->attrs->gw;
@@ -860,14 +855,14 @@ bgp_update_attrs(struct bgp_proto *p, rte *e, ea_list **attrs, struct linpool *p
}
a = ea_find(e->attrs->eattrs, EA_CODE(EAP_BGP, BA_NEXT_HOP));
- if (a && (p->is_internal || (!p->is_internal && e->attrs->iface == p->neigh->iface)))
+ if (a && !p->cf->next_hop_self && (p->is_internal || (!p->is_internal && e->attrs->iface == p->neigh->iface)))
{
/* Leave the original next hop attribute, will check later where does it point */
}
else
{
/* Need to create new one */
- bgp_attach_attr_ip(attrs, pool, BA_NEXT_HOP, p->local_addr);
+ bgp_attach_attr_ip(attrs, pool, BA_NEXT_HOP, p->source_addr);
}
if (rr)