options.
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;
}
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)
DBG("BGP: Connecting\n");
s = sk_new(p->p.pool);
s->type = SK_TCP_ACTIVE;
- if (ipa_nonzero(p->cf->source_addr))
- s->saddr = p->cf->source_addr;
- else
- s->saddr = p->local_addr;
+ s->saddr = p->source_addr;
s->daddr = p->cf->remote_ip;
s->dport = BGP_PORT;
s->ttl = p->cf->multihop ? : 1;
bgp_start_neighbor(struct bgp_proto *p)
{
p->local_addr = p->neigh->iface->addr->ip;
- DBG("BGP: local=%I remote=%I\n", p->local_addr, p->next_hop);
+ p->source_addr = ipa_nonzero(p->cf->source_addr) ? p->cf->source_addr : p->local_addr;
+
+ DBG("BGP: local=%I remote=%I\n", p->source_addr, p->next_hop);
#ifdef IPV6
{
struct ifa *a;
ip_addr next_hop; /* Either the peer or multihop_via */
struct neighbor *neigh; /* Neighbor entry corresponding to next_hop */
ip_addr local_addr; /* Address of the local end of the link to next_hop */
+ ip_addr source_addr; /* Address used as advertised next hop, usually local_addr */
struct event *event; /* Event for respawning and shutting process */
struct bgp_bucket **bucket_hash; /* Hash table of attribute buckets */
unsigned int hash_size, hash_count, hash_limit;
ASSERT(nh);
ip = *(ip_addr *) nh->u.ptr->data;
is_ll = 0;
- if (ipa_equal(ip, p->local_addr))
+ if (ipa_equal(ip, p->source_addr))
{
is_ll = 1;
ip_ll = p->local_link;