mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-17 08:38:42 +00:00
39 lines
1.1 KiB
C
39 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;
|
||
|
}
|