Fixes handling of 'next hop self' and 'source address' configuration
options.
This commit is contained in:
parent
a6ee026693
commit
ad440a570b
4 changed files with 9 additions and 14 deletions
|
@ -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 ||
|
if (p->cf->next_hop_self ||
|
||||||
!p->is_internal ||
|
!p->is_internal ||
|
||||||
rta->dest != RTD_ROUTER)
|
rta->dest != RTD_ROUTER)
|
||||||
{
|
*(ip_addr *)z = p->source_addr;
|
||||||
if (ipa_nonzero(p->cf->source_addr))
|
|
||||||
*(ip_addr *)z = p->cf->source_addr;
|
|
||||||
else
|
|
||||||
*(ip_addr *)z = p->local_addr;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
*(ip_addr *)z = e->attrs->gw;
|
*(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));
|
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 */
|
/* Leave the original next hop attribute, will check later where does it point */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Need to create new one */
|
/* 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)
|
if (rr)
|
||||||
|
|
|
@ -500,10 +500,7 @@ bgp_connect(struct bgp_proto *p) /* Enter Connect state and start establishing c
|
||||||
DBG("BGP: Connecting\n");
|
DBG("BGP: Connecting\n");
|
||||||
s = sk_new(p->p.pool);
|
s = sk_new(p->p.pool);
|
||||||
s->type = SK_TCP_ACTIVE;
|
s->type = SK_TCP_ACTIVE;
|
||||||
if (ipa_nonzero(p->cf->source_addr))
|
s->saddr = p->source_addr;
|
||||||
s->saddr = p->cf->source_addr;
|
|
||||||
else
|
|
||||||
s->saddr = p->local_addr;
|
|
||||||
s->daddr = p->cf->remote_ip;
|
s->daddr = p->cf->remote_ip;
|
||||||
s->dport = BGP_PORT;
|
s->dport = BGP_PORT;
|
||||||
s->ttl = p->cf->multihop ? : 1;
|
s->ttl = p->cf->multihop ? : 1;
|
||||||
|
@ -609,7 +606,9 @@ static void
|
||||||
bgp_start_neighbor(struct bgp_proto *p)
|
bgp_start_neighbor(struct bgp_proto *p)
|
||||||
{
|
{
|
||||||
p->local_addr = p->neigh->iface->addr->ip;
|
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
|
#ifdef IPV6
|
||||||
{
|
{
|
||||||
struct ifa *a;
|
struct ifa *a;
|
||||||
|
|
|
@ -79,6 +79,7 @@ struct bgp_proto {
|
||||||
ip_addr next_hop; /* Either the peer or multihop_via */
|
ip_addr next_hop; /* Either the peer or multihop_via */
|
||||||
struct neighbor *neigh; /* Neighbor entry corresponding to next_hop */
|
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 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 event *event; /* Event for respawning and shutting process */
|
||||||
struct bgp_bucket **bucket_hash; /* Hash table of attribute buckets */
|
struct bgp_bucket **bucket_hash; /* Hash table of attribute buckets */
|
||||||
unsigned int hash_size, hash_count, hash_limit;
|
unsigned int hash_size, hash_count, hash_limit;
|
||||||
|
|
|
@ -293,7 +293,7 @@ bgp_create_update(struct bgp_conn *conn, byte *buf)
|
||||||
ASSERT(nh);
|
ASSERT(nh);
|
||||||
ip = *(ip_addr *) nh->u.ptr->data;
|
ip = *(ip_addr *) nh->u.ptr->data;
|
||||||
is_ll = 0;
|
is_ll = 0;
|
||||||
if (ipa_equal(ip, p->local_addr))
|
if (ipa_equal(ip, p->source_addr))
|
||||||
{
|
{
|
||||||
is_ll = 1;
|
is_ll = 1;
|
||||||
ip_ll = p->local_link;
|
ip_ll = p->local_link;
|
||||||
|
|
Loading…
Reference in a new issue