]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Send and receive communities.
authorMartin Mares <mj@ucw.cz>
Mon, 17 Apr 2000 10:19:15 +0000 (10:19 +0000)
committerMartin Mares <mj@ucw.cz>
Mon, 17 Apr 2000 10:19:15 +0000 (10:19 +0000)
proto/bgp/attrs.c
proto/bgp/bgp.h
proto/bgp/packets.c

index bc3de3b30dfab3d3e088c91c79a86d8c6b033d16..d99c7f8e3fc2fe9850a642d94c8e11b3c7f7f39a 100644 (file)
@@ -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;
+         }
        }
     }
 
index 0f84c3bffd3e06c44ee340314074aeca4c4a8a25..722e12e508dd34bb9b58330b9fc9a5636eb744ca 100644 (file)
@@ -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
index 2f3f8ad94b0213b79010783a93eb306d55dcd8bb..f1555ca8efbb595f7e716382090ec068c8868714 100644 (file)
@@ -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))
     {