summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2009-09-18 13:59:04 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2009-09-18 13:59:04 +0200
commit54fe0d9230be440d9f627ff7f94a202e6117e1b9 (patch)
tree2c72ea7fc093a528bbd14bb70542fd912bc6bfa7
parentdb96fccb31bc0436ec182ff825f592d6c16dc930 (diff)
Fixes setting of IP addresses to route attributes (NEXT_HOP).
-rw-r--r--filter/filter.c1
-rw-r--r--proto/bgp/packets.c8
2 files changed, 6 insertions, 3 deletions
diff --git a/filter/filter.c b/filter/filter.c
index 6356632b..8c0c4ab5 100644
--- a/filter/filter.c
+++ b/filter/filter.c
@@ -664,6 +664,7 @@ interpret(struct f_inst *what)
struct adata *ad = lp_alloc(f_pool, sizeof(struct adata) + len);
ad->length = len;
(* (ip_addr *) ad->data) = v1.val.px.ip;
+ l->attrs[0].u.ptr = ad;
break;
case EAF_TYPE_AS_PATH:
if (v1.type != T_PATH)
diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c
index 49c2add6..482b707d 100644
--- a/proto/bgp/packets.c
+++ b/proto/bgp/packets.c
@@ -234,7 +234,7 @@ bgp_create_update(struct bgp_conn *conn, byte *buf)
{
struct bgp_proto *p = conn->bgp;
struct bgp_bucket *buck;
- int size;
+ int size, second;
int remains = BGP_MAX_PACKET_LENGTH - BGP_HEADER_LENGTH - 4;
byte *w, *tmp, *tstart;
ip_addr *ipp, ip, ip_ll;
@@ -292,7 +292,9 @@ bgp_create_update(struct bgp_conn *conn, byte *buf)
nh = ea_find(buck->eattrs, EA_CODE(EAP_BGP, BA_NEXT_HOP));
ASSERT(nh);
- /* We have two addresses here in 'nh'. Really. */
+ /* We have two addresses here in 'nh'. Really.
+ Unless NEXT_HOP was modified by filter */
+ second = (nh->u.ptr->length == NEXT_HOP_LENGTH);
ipp = (ip_addr *) nh->u.ptr->data;
ip = ipp[0];
ip_ll = IPA_NONE;
@@ -316,7 +318,7 @@ bgp_create_update(struct bgp_conn *conn, byte *buf)
n = neigh_find(&p->p, &ip, 0);
if (n && n->iface == p->neigh->iface)
{
- if (ipa_nonzero(ipp[1]))
+ if (second && ipa_nonzero(ipp[1]))
ip_ll = ipp[1];
else
{