diff options
author | Martin Mares <mj@ucw.cz> | 2000-04-17 12:19:15 +0200 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 2000-04-17 12:19:15 +0200 |
commit | 1ed2fe960929081065e75a7fb4322f28a76c508b (patch) | |
tree | 5298085a496c85304b3cb18ac4060fe3011fddca /proto | |
parent | c6add07fa6ca8366fbdcfcd9bc2872c129378366 (diff) | |
download | bird-1ed2fe960929081065e75a7fb4322f28a76c508b.tar bird-1ed2fe960929081065e75a7fb4322f28a76c508b.zip |
Send and receive communities.
Diffstat (limited to 'proto')
-rw-r--r-- | proto/bgp/attrs.c | 24 | ||||
-rw-r--r-- | proto/bgp/bgp.h | 3 | ||||
-rw-r--r-- | proto/bgp/packets.c | 1 |
3 files changed, 20 insertions, 8 deletions
diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c index bc3de3b..d99c7f8 100644 --- a/proto/bgp/attrs.c +++ b/proto/bgp/attrs.c @@ -54,7 +54,7 @@ bgp_check_path(struct bgp_proto *p, byte *a, int len) { DBG("Path segment %02x %02x\n", a[0], a[1]); if (len < 2 || - a[0] != BGP_PATH_AS_SET && a[0] != BGP_PATH_AS_SEQUENCE || + a[0] != AS_PATH_SET && a[0] != AS_PATH_SEQUENCE || 2*a[1] + 2 > len) return 11; len -= 2*a[1] + 2; @@ -101,9 +101,9 @@ static struct attr_desc bgp_attr_table[] = { NULL, NULL }, { "aggregator", 6, BAF_OPTIONAL, EAF_TYPE_OPAQUE, /* BA_AGGREGATOR */ NULL, NULL }, + { "community", -1, BAF_OPTIONAL | BAF_TRANSITIVE, EAF_TYPE_INT_SET, /* BA_COMMUNITY */ + NULL, NULL }, #if 0 - /* FIXME: Handle community lists and remember to convert their endianity and normalize them */ - { 0, 0 }, /* BA_COMMUNITY */ { 0, 0 }, /* BA_ORIGINATOR_ID */ { 0, 0 }, /* BA_CLUSTER_LIST */ #endif @@ -177,9 +177,16 @@ bgp_encode_attrs(byte *w, struct bgp_bucket *buck) memcpy(w, &ip, len); break; } + case EAF_TYPE_INT_SET: + { + u32 *z = (u32 *)a->u.ptr->data; + int i; + for(i=0; i<len; i+=4) + put_u32(w+i, *z++); + break; + } case EAF_TYPE_OPAQUE: case EAF_TYPE_AS_PATH: - case EAF_TYPE_INT_SET: memcpy(w, a->u.ptr->data, len); break; default: @@ -318,7 +325,7 @@ bgp_get_bucket(struct bgp_proto *p, ea_list *old, ea_list *tmp) a = &new->attrs[i]; #ifdef LOCAL_DEBUG { - byte buf[256]; + byte buf[EA_FORMAT_BUF_SIZE]; ea_format(a, buf); DBG("\t%s\n", buf); } @@ -710,6 +717,13 @@ bgp_decode_attrs(struct bgp_conn *conn, byte *attr, unsigned int len, struct lin case EAF_TYPE_IP_ADDRESS: ipa_ntoh(*(ip_addr *)ad->data); break; + case EAF_TYPE_INT_SET: + { + u32 *z = (u32 *) ad->data; + for(i=0; i<ad->length/4; i++) + z[i] = ntohl(z[i]); + break; + } } } diff --git a/proto/bgp/bgp.h b/proto/bgp/bgp.h index 0f84c3b..722e12e 100644 --- a/proto/bgp/bgp.h +++ b/proto/bgp/bgp.h @@ -139,9 +139,6 @@ int bgp_rx(struct birdsock *sk, int size); #define BA_MP_UNREACH_NLRI 0x0f #define BA_EXTENDED_COMM 0x10 /* draft-ramachandra-bgp-ext-communities */ -#define BGP_PATH_AS_SET 1 /* Types of path segments */ -#define BGP_PATH_AS_SEQUENCE 2 - /* BGP states */ #define BS_IDLE 0 diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c index 2f3f8ad..f1555ca 100644 --- a/proto/bgp/packets.c +++ b/proto/bgp/packets.c @@ -81,6 +81,7 @@ bgp_create_update(struct bgp_conn *conn, byte *buf) int r_size = 0; DBG("BGP: Sending update\n"); + /* FIXME: Better timing of updates */ w = buf+2; if ((buck = bgp->withdraw_bucket) && !EMPTY_LIST(buck->prefixes)) { |