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.
This commit is contained in:
parent
ebff007f08
commit
c0668f3696
6 changed files with 69 additions and 27 deletions
|
@ -1,4 +1,5 @@
|
||||||
source=rt-table.c rt-fib.c rt-attr.c proto.c iface.c rt-dev.c password.c cli.c locks.c cmds.c neighbor.c
|
source=rt-table.c rt-fib.c rt-attr.c proto.c iface.c rt-dev.c password.c cli.c locks.c cmds.c neighbor.c \
|
||||||
|
a-path.c a-set.c
|
||||||
root-rel=../
|
root-rel=../
|
||||||
dir-name=nest
|
dir-name=nest
|
||||||
|
|
||||||
|
|
38
nest/a-path.c
Normal file
38
nest/a-path.c
Normal file
|
@ -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;
|
||||||
|
}
|
12
nest/a-set.c
Normal file
12
nest/a-set.c
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
/*
|
||||||
|
* BIRD -- Set/Community-list 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"
|
16
nest/attrs.h
Normal file
16
nest/attrs.h
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* BIRD Internet Routing Daemon -- Attribute Operations
|
||||||
|
*
|
||||||
|
* (c) 2000 Martin Mares <mj@ucw.cz>
|
||||||
|
*
|
||||||
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BIRD_ATTRS_H_
|
||||||
|
#define _BIRD_ATTRS_H_
|
||||||
|
|
||||||
|
/* a-path.c */
|
||||||
|
|
||||||
|
struct adata *as_path_prepend(struct linpool *pool, struct adata *olda, int as);
|
||||||
|
|
||||||
|
#endif
|
|
@ -12,6 +12,7 @@
|
||||||
#include "nest/iface.h"
|
#include "nest/iface.h"
|
||||||
#include "nest/protocol.h"
|
#include "nest/protocol.h"
|
||||||
#include "nest/route.h"
|
#include "nest/route.h"
|
||||||
|
#include "nest/attrs.h"
|
||||||
#include "conf/conf.h"
|
#include "conf/conf.h"
|
||||||
#include "lib/resource.h"
|
#include "lib/resource.h"
|
||||||
#include "lib/string.h"
|
#include "lib/string.h"
|
||||||
|
@ -278,31 +279,6 @@ bgp_create_attrs(struct bgp_proto *p, rte *e, ea_list **attrs, struct linpool *p
|
||||||
return 0; /* Leave decision to the filters */
|
return 0; /* Leave decision to the filters */
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ea_list *
|
static ea_list *
|
||||||
bgp_path_prepend(struct linpool *pool, eattr *a, ea_list *old, int as)
|
bgp_path_prepend(struct linpool *pool, eattr *a, ea_list *old, int as)
|
||||||
{
|
{
|
||||||
|
|
|
@ -96,7 +96,6 @@ int bgp_get_attr(struct eattr *e, byte *buf);
|
||||||
int bgp_rte_better(struct rte *, struct rte *);
|
int bgp_rte_better(struct rte *, struct rte *);
|
||||||
void bgp_rt_notify(struct proto *, struct network *, struct rte *, struct rte *, struct ea_list *);
|
void bgp_rt_notify(struct proto *, struct network *, struct rte *, struct rte *, struct ea_list *);
|
||||||
int bgp_import_control(struct proto *, struct rte **, struct ea_list **, struct linpool *);
|
int bgp_import_control(struct proto *, struct rte **, struct ea_list **, struct linpool *);
|
||||||
struct adata *as_path_prepend(struct linpool *pool, struct adata *olda, int as);
|
|
||||||
void bgp_attr_init(struct bgp_proto *);
|
void bgp_attr_init(struct bgp_proto *);
|
||||||
|
|
||||||
/* packets.c */
|
/* packets.c */
|
||||||
|
|
Loading…
Reference in a new issue