/* * BIRD -- Path Operations * * (c) 2000 Martin Mares * (c) 2000 Pavel Machek * * 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; }