c0668f3696
on AS paths and community sets. Moved as_path_prepend() there. Pavel, please move the other functions as well.
38 lines
1.1 KiB
C
38 lines
1.1 KiB
C
/*
|
|
* 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;
|
|
}
|