summaryrefslogtreecommitdiffstats
path: root/nest/a-path.c
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2000-04-17 09:53:29 +0200
committerMartin Mares <mj@ucw.cz>2000-04-17 09:53:29 +0200
commitc0668f36967ce651e452a476b786b7604038a556 (patch)
tree37ce9ac274e1badc32f0e7badc4d6e8dd2e78213 /nest/a-path.c
parentebff007f08965d83dba5840ee02171d09ac2598d (diff)
downloadbird-c0668f36967ce651e452a476b786b7604038a556.tar
bird-c0668f36967ce651e452a476b786b7604038a556.zip
Created nest/a-path.c and a-set.c which should contain general operations
on AS paths and community sets. Moved as_path_prepend() there. Pavel, please move the other functions as well.
Diffstat (limited to 'nest/a-path.c')
-rw-r--r--nest/a-path.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/nest/a-path.c b/nest/a-path.c
new file mode 100644
index 0000000..557f29c
--- /dev/null
+++ b/nest/a-path.c
@@ -0,0 +1,38 @@
+/*
+ * BIRD -- Path Operations
+ *
+ * (c) 2000 Martin Mares <mj@ucw.cz>
+ * (c) 2000 Pavel Machek <pavel@ucw.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#include "nest/bird.h"
+#include "nest/route.h"
+#include "lib/resource.h"
+#include "lib/unaligned.h"
+
+struct adata *
+as_path_prepend(struct linpool *pool, struct adata *olda, int as)
+{
+ struct adata *newa;
+
+ if (olda->length && olda->data[0] == 2 && olda->data[1] < 255) /* Starting with sequence => just prepend the AS number */
+ {
+ newa = lp_alloc(pool, sizeof(struct adata) + olda->length + 2);
+ newa->length = olda->length + 2;
+ newa->data[0] = 2;
+ newa->data[1] = olda->data[1] + 1;
+ memcpy(newa->data+4, olda->data+2, olda->length-2);
+ }
+ else /* Create new path segment */
+ {
+ newa = lp_alloc(pool, sizeof(struct adata) + olda->length + 4);
+ newa->length = olda->length + 4;
+ newa->data[0] = 2;
+ newa->data[1] = 1;
+ memcpy(newa->data+4, olda->data, olda->length);
+ }
+ put_u16(newa->data+2, as);
+ return newa;
+}