]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Remove bgp_as4_support variable.
authorOndrej Zajicek <santiago@crfreenet.org>
Mon, 14 Dec 2009 22:31:25 +0000 (23:31 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Mon, 14 Dec 2009 22:31:25 +0000 (23:31 +0100)
nest/a-path.c
proto/bgp/attrs.c
proto/bgp/bgp.c
proto/bgp/bgp.h
proto/bgp/config.Y

index c804619b006df0c170a7addd69233377d2f89da7..396d463269583e07ac841122803e4364c4c36457 100644 (file)
 #include "filter/filter.h"
 
 
-/* Global AS4 support, shared by all BGP instances.
- * This specifies whether BA_AS_PATH attributes contain 2 or 4 B per ASN
- */
-
-int bgp_as4_support = 1;
+// static inline void put_as(byte *data, u32 as) { put_u32(data, as); }
+// static inline u32 get_as(byte *data) { return get_u32(data); }
 
-static void
-put_as(byte *data, u32 as)
-{
-  if (bgp_as4_support)
-    put_u32(data, as);
-  else if (as <= 0xFFFF)
-    put_u16(data, as);
-  else
-    bug("put_as: Try to put 32bit AS to 16bit AS Path");
-}
-
-static inline u32
-get_as(byte *data)
-{
-  return bgp_as4_support ? get_u32(data) : get_u16(data);
-}
+#define put_as put_u32
+#define get_as get_u32
+#define BS  4
 
 struct adata *
 as_path_prepend(struct linpool *pool, struct adata *olda, u32 as)
 {
-  int bs = bgp_as4_support ? 4 : 2;
   struct adata *newa;
 
   if (olda->length && olda->data[0] == AS_PATH_SEQUENCE && olda->data[1] < 255)
     /* Starting with sequence => just prepend the AS number */
     {
-      int nl = olda->length + bs;
+      int nl = olda->length + BS;
       newa = lp_alloc(pool, sizeof(struct adata) + nl);
       newa->length = nl;
       newa->data[0] = AS_PATH_SEQUENCE;
       newa->data[1] = olda->data[1] + 1;
-      memcpy(newa->data + bs + 2, olda->data + 2, olda->length - 2);
+      memcpy(newa->data + BS + 2, olda->data + 2, olda->length - 2);
     }
   else /* Create new path segment */
     {
-      int nl = olda->length + bs + 2;
+      int nl = olda->length + BS + 2;
       newa = lp_alloc(pool, sizeof(struct adata) + nl);
       newa->length = nl;
       newa->data[0] = AS_PATH_SEQUENCE;
       newa->data[1] = 1;
-      memcpy(newa->data + bs + 2, olda->data, olda->length);
+      memcpy(newa->data + BS + 2, olda->data, olda->length);
     }
   put_as(newa->data + 2, as);
   return newa;
@@ -144,7 +127,6 @@ as_path_convert_to_new(struct adata *path, byte *dst, int req_as)
 void
 as_path_format(struct adata *path, byte *buf, unsigned int size)
 {
-  int bs = bgp_as4_support ? 4 : 2;
   byte *p = path->data;
   byte *e = p + path->length;
   byte *end = buf + size - 16;
@@ -172,7 +154,7 @@ as_path_format(struct adata *path, byte *buf, unsigned int size)
          if (!sp)
            *buf++ = ' ';
          buf += bsprintf(buf, "%u", get_as(p));
-         p += bs;
+         p += BS;
          sp = 0;
        }
       if (isset)
@@ -188,8 +170,7 @@ as_path_format(struct adata *path, byte *buf, unsigned int size)
 int
 as_path_getlen(struct adata *path)
 {
-  int bs = bgp_as4_support ? 4 : 2;
-  return as_path_getlen_int(path, bs);
+  return as_path_getlen_int(path, BS);
 }
 
 int
@@ -215,7 +196,6 @@ as_path_getlen_int(struct adata *path, int bs)
 int
 as_path_get_last(struct adata *path, u32 *orig_as)
 {
-  int bs = bgp_as4_support ? 4 : 2;
   int found = 0;
   u32 res = 0;
   u8 *p = path->data;
@@ -230,15 +210,15 @@ as_path_get_last(struct adata *path, u32 *orig_as)
          if (len = *p++)
            {
              found = 0;
-             p += bs * len;
+             p += BS * len;
            }
          break;
        case AS_PATH_SEQUENCE:
          if (len = *p++)
            {
              found = 1;
-             res = get_as(p + bs * (len - 1));
-             p += bs * len;
+             res = get_as(p + BS * (len - 1));
+             p += BS * len;
            }
          break;
        default: bug("as_path_get_first: Invalid path segment");
@@ -267,7 +247,6 @@ as_path_get_first(struct adata *path, u32 *last_as)
 int
 as_path_is_member(struct adata *path, u32 as)
 {
-  int bs = bgp_as4_support ? 4 : 2;
   u8 *p = path->data;
   u8 *q = p+path->length;
   int i, n;
@@ -280,7 +259,7 @@ as_path_is_member(struct adata *path, u32 as)
        {
          if (get_as(p) == as)
            return 1;
-         p += bs;
+         p += BS;
        }
     }
   return 0;
@@ -301,7 +280,6 @@ struct pm_pos
 static int
 parse_path(struct adata *path, struct pm_pos *pos)
 {
-  int bs = bgp_as4_support ? 4 : 2;
   u8 *p = path->data;
   u8 *q = p + path->length;
   struct pm_pos *opos = pos;
@@ -316,7 +294,7 @@ parse_path(struct adata *path, struct pm_pos *pos)
        pos->mark = 0;
        pos->val.sp = p;
        len = *p;
-       p += 1 + bs * len;
+       p += 1 + BS * len;
        pos++;
        break;
       
@@ -327,7 +305,7 @@ parse_path(struct adata *path, struct pm_pos *pos)
            pos->set = 0;
            pos->mark = 0;
            pos->val.asn = get_as(p);
-           p += bs;
+           p += BS;
            pos++;
          }
        break;
@@ -346,13 +324,12 @@ pm_match(struct pm_pos *pos, u32 asn)
   if (! pos->set)
     return pos->val.asn == asn;
 
-  int bs = bgp_as4_support ? 4 : 2;
   u8 *p = pos->val.sp;
   int len = *p++;
   int i;
 
   for (i = 0; i < len; i++)
-    if (get_as(p + i * bs) == asn)
+    if (get_as(p + i * BS) == asn)
       return 1;
 
   return 0;
index 7b49bdfa5c62ea9bb4c554f7ec2c480d8f0345e4..ec81bd006ec385dc6f2b6d5d5ece37673bb357ea 100644 (file)
@@ -196,16 +196,8 @@ bgp_format_aggregator(eattr *a, byte *buf, int buflen UNUSED)
   byte *data = ad->data;
   u32 as;
 
-  if (bgp_as4_support)
-    {
-      as = get_u32(data);
-      data += 4;
-    }
-  else
-    {
-      as = get_u16(data);
-      data += 2;
-    }
+  as = get_u32(data);
+  data += 4;
 
   bsprintf(buf, "%d.%d.%d.%d AS%d", data[0], data[1], data[2], data[3], as);
 }
@@ -279,9 +271,8 @@ static struct attr_desc bgp_attr_table[] = {
     NULL, NULL }
 };
 
-/* BA_AS4_PATH is type EAF_TYPE_OPAQUE and not type EAF_TYPE_AS_PATH because
- * EAF_TYPE_AS_PATH is supposed to have different format (2 or 4 B for each ASN)
- * depending on bgp_as4_support variable.
+/* BA_AS4_PATH is type EAF_TYPE_OPAQUE and not type EAF_TYPE_AS_PATH.
+ * It does not matter as this attribute does not appear on routes in the routing table.
  */
 
 #define ATTR_KNOWN(code) ((code) < ARRAY_SIZE(bgp_attr_table) && bgp_attr_table[code].name)
@@ -449,7 +440,7 @@ bgp_encode_attrs(struct bgp_proto *p, byte *w, ea_list *attrs, int remains)
        * we have to convert our 4B AS_PATH to 2B AS_PATH and send our AS_PATH 
        * as optional AS4_PATH attribute.
        */
-      if ((code == BA_AS_PATH) && bgp_as4_support && (! p->as4_session))
+      if ((code == BA_AS_PATH) && (! p->as4_session))
        {
          len = a->u.ptr->length;
 
@@ -491,7 +482,7 @@ bgp_encode_attrs(struct bgp_proto *p, byte *w, ea_list *attrs, int remains)
        }
 
       /* The same issue with AGGREGATOR attribute */
-      if ((code == BA_AGGREGATOR) && bgp_as4_support && (! p->as4_session))
+      if ((code == BA_AGGREGATOR) && (! p->as4_session))
        {
          int new_used;
 
@@ -864,14 +855,10 @@ bgp_create_attrs(struct bgp_proto *p, rte *e, ea_list **attrs, struct linpool *p
     bgp_set_attr_wa(ea->attrs+1, pool, BA_AS_PATH, 0);
   else
     {
-      z = bgp_set_attr_wa(ea->attrs+1, pool, BA_AS_PATH, bgp_as4_support ? 6 : 4);
+      z = bgp_set_attr_wa(ea->attrs+1, pool, BA_AS_PATH, 6);
       z[0] = AS_PATH_SEQUENCE;
       z[1] = 1;                                /* 1 AS */
-
-      if (bgp_as4_support)
-       put_u32(z+2, p->local_as);
-      else
-       put_u16(z+2, p->local_as);
+      put_u32(z+2, p->local_as);
     }
 
   z = bgp_set_attr_wa(ea->attrs+2, pool, BA_NEXT_HOP, NEXT_HOP_LENGTH);
@@ -1416,11 +1403,10 @@ bgp_decode_attrs(struct bgp_conn *conn, byte *attr, unsigned int len, struct lin
   /* When receiving attributes from non-AS4-aware BGP speaker,
    * we have to reconstruct 4B AS_PATH and AGGREGATOR attributes
    */
-  if (bgp_as4_support && (! bgp->as4_session))
+  if (! bgp->as4_session)
     bgp_reconstruct_4b_atts(bgp, a, pool);
 
-  if (bgp_as4_support)
-    bgp_remove_as4_attrs(bgp, a);
+  bgp_remove_as4_attrs(bgp, a);
 
   /* If the AS path attribute contains our AS, reject the routes */
   if (bgp_as_path_loopy(bgp, a))
index 24cd20238d19d4cf8ea294a8c3e9abae017b6bf1..3cbcb6d75f5673b1e1869676eef7530ba610ed17 100644 (file)
@@ -884,12 +884,6 @@ bgp_check(struct bgp_config *c)
   if (!c->remote_as)
     cf_error("Neighbor must be configured");
 
-  if (!bgp_as4_support && c->enable_as4)
-    cf_error("AS4 support disabled globally");
-
-  if (!bgp_as4_support && (c->local_as > 0xFFFF))
-    cf_error("Local AS number out of range");
-
   if (!(c->capabilities && c->enable_as4) && (c->remote_as > 0xFFFF))
     cf_error("Neighbor AS number out of range (AS4 not available)");
 
index 59ec9c163d5e9a87b684715a1afb4e682388e469..7cbd6557fb9327cbbe554d23664c85bf83121cee 100644 (file)
@@ -132,8 +132,6 @@ struct bgp_bucket {
 
 extern struct linpool *bgp_linpool;
 
-extern int bgp_as4_support;
-
 
 void bgp_start_timer(struct timer *t, int value);
 void bgp_check(struct bgp_config *c);
index 3c73d60e1c4168f8b5924a29f28a6c26b60c8fa0..a469b4d70ba229eed88557caf5473ce228eb3a0d 100644 (file)
@@ -41,7 +41,7 @@ bgp_proto_start: proto_start BGP {
      BGP_CFG->error_delay_time_min = 60;
      BGP_CFG->error_delay_time_max = 300;
      BGP_CFG->enable_refresh = 1;
-     BGP_CFG->enable_as4 = bgp_as4_support;
+     BGP_CFG->enable_as4 = 1;
      BGP_CFG->capabilities = 2;
      BGP_CFG->advertise_ipv4 = 1;
  }