]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: Cluster list item should be prepended
authorOndrej Zajicek (work) <santiago@crfreenet.org>
Tue, 15 Nov 2016 15:24:39 +0000 (16:24 +0100)
committerOndrej Zajicek (work) <santiago@crfreenet.org>
Tue, 15 Nov 2016 15:24:39 +0000 (16:24 +0100)
Commit 3c09af41... changed behavior of int_set_add() from prepend to
append, which makes more sense for community list, but prepend must be
used for cluster list. Add int_set_prepend() and use it in cluster list
handling code.

nest/a-set.c
nest/attrs.h
proto/bgp/attrs.c

index bd244e2e3662338cd3e3fc6a3baa81fac57acc29..a6c07f45de641daa32c6619d374ccadabea59f83 100644 (file)
@@ -231,6 +231,26 @@ lc_set_contains(struct adata *list, lcomm val)
   return 0;
 }
 
+struct adata *
+int_set_prepend(struct linpool *pool, struct adata *list, u32 val)
+{
+  struct adata *res;
+  int len;
+
+  if (int_set_contains(list, val))
+    return list;
+
+  len = list ? list->length : 0;
+  res = lp_alloc(pool, sizeof(struct adata) + len + 4);
+  res->length = len + 4;
+
+  if (list)
+    memcpy(res->data + 4, list->data, list->length);
+
+  * (u32 *) res->data = val;
+
+  return res;
+}
 
 struct adata *
 int_set_add(struct linpool *pool, struct adata *list, u32 val)
@@ -248,8 +268,7 @@ int_set_add(struct linpool *pool, struct adata *list, u32 val)
   if (list)
     memcpy(res->data, list->data, list->length);
 
-  u32 *c = (u32 *) (res->data + len);
-  *c = val;
+  * (u32 *) (res->data + len) = val;
 
   return res;
 }
index 548d71a9aac8ad9ddc675e73ef633ddcbe842a46..a34e64d3b37d824a93d0f8179595b69e4d5cd743 100644 (file)
@@ -132,6 +132,7 @@ int lc_set_format(struct adata *set, int from, byte *buf, uint size);
 int int_set_contains(struct adata *list, u32 val);
 int ec_set_contains(struct adata *list, u64 val);
 int lc_set_contains(struct adata *list, lcomm val);
+struct adata *int_set_prepend(struct linpool *pool, struct adata *list, u32 val);
 struct adata *int_set_add(struct linpool *pool, struct adata *list, u32 val);
 struct adata *ec_set_add(struct linpool *pool, struct adata *list, u64 val);
 struct adata *lc_set_add(struct linpool *pool, struct adata *list, lcomm val);
index 0309c1f774e16986a10d16c382f881f5f4da814e..aa2a3b4601022afb152c08e4b358aeca404b76fa 100644 (file)
@@ -1077,7 +1077,7 @@ static inline void
 bgp_cluster_list_prepend(rte *e, ea_list **attrs, struct linpool *pool, u32 cid)
 {
   eattr *a = ea_find(e->attrs->eattrs, EA_CODE(EAP_BGP, BA_CLUSTER_LIST));
-  bgp_attach_attr(attrs, pool, BA_CLUSTER_LIST, (uintptr_t) int_set_add(pool, a ? a->u.ptr : NULL, cid));
+  bgp_attach_attr(attrs, pool, BA_CLUSTER_LIST, (uintptr_t) int_set_prepend(pool, a ? a->u.ptr : NULL, cid));
 }
 
 static int