mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2025-01-03 15:41:54 +00:00
Merge commit '4a23ede2b056a41456790cc20a0c3d92a7137693' into haugesund
This commit is contained in:
commit
d7b077f5d6
10
Makefile.in
10
Makefile.in
@ -82,6 +82,9 @@ conf-lex-targets := $(addprefix $(objdir)/conf/,cf-lex.o)
|
|||||||
conf-y-targets := $(addprefix $(objdir)/conf/,cf-parse.y keywords.h commands.h)
|
conf-y-targets := $(addprefix $(objdir)/conf/,cf-parse.y keywords.h commands.h)
|
||||||
cf-local = $(conf-y-targets): $(s)config.Y
|
cf-local = $(conf-y-targets): $(s)config.Y
|
||||||
|
|
||||||
|
# nest/Makefile declarations needed for all other modules
|
||||||
|
proto-build-c := $(addprefix $(objdir)/nest/,proto-build.c)
|
||||||
|
|
||||||
src-o-files = $(patsubst %.c,$(o)%.o,$(src))
|
src-o-files = $(patsubst %.c,$(o)%.o,$(src))
|
||||||
tests-target-files = $(patsubst %.c,$(o)%,$(tests_src))
|
tests-target-files = $(patsubst %.c,$(o)%,$(tests_src))
|
||||||
|
|
||||||
@ -95,6 +98,13 @@ else
|
|||||||
o = $(patsubst $(srcdir)%,$(objdir)%,$(s))
|
o = $(patsubst $(srcdir)%,$(objdir)%,$(s))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
define proto-build_in =
|
||||||
|
PROTO_BUILD += $(1)
|
||||||
|
$(proto-build-c): $(lastword $(MAKEFILE_LIST))
|
||||||
|
endef
|
||||||
|
|
||||||
|
proto-build = $(eval $(call proto-build_in,$(1)))
|
||||||
|
|
||||||
define clean_in =
|
define clean_in =
|
||||||
clean::
|
clean::
|
||||||
rm -f $(addprefix $(o),$(1))
|
rm -f $(addprefix $(o),$(1))
|
||||||
|
@ -714,9 +714,6 @@
|
|||||||
case EAF_TYPE_LC_SET:
|
case EAF_TYPE_LC_SET:
|
||||||
RESULT_(T_LCLIST, ad, e->u.ptr);
|
RESULT_(T_LCLIST, ad, e->u.ptr);
|
||||||
break;
|
break;
|
||||||
case EAF_TYPE_UNDEF:
|
|
||||||
RESULT_VOID;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
bug("Unknown dynamic attribute type");
|
bug("Unknown dynamic attribute type");
|
||||||
}
|
}
|
||||||
@ -737,7 +734,9 @@
|
|||||||
l->count = 1;
|
l->count = 1;
|
||||||
l->attrs[0].id = da.ea_code;
|
l->attrs[0].id = da.ea_code;
|
||||||
l->attrs[0].flags = 0;
|
l->attrs[0].flags = 0;
|
||||||
l->attrs[0].type = da.type | EAF_ORIGINATED | EAF_FRESH;
|
l->attrs[0].type = da.type;
|
||||||
|
l->attrs[0].originated = 1;
|
||||||
|
l->attrs[0].fresh = 1;
|
||||||
|
|
||||||
switch (da.type) {
|
switch (da.type) {
|
||||||
case EAF_TYPE_INT:
|
case EAF_TYPE_INT:
|
||||||
@ -792,21 +791,8 @@
|
|||||||
ACCESS_RTE;
|
ACCESS_RTE;
|
||||||
ACCESS_EATTRS;
|
ACCESS_EATTRS;
|
||||||
|
|
||||||
{
|
|
||||||
struct ea_list *l = lp_alloc(fs->pool, sizeof(struct ea_list) + sizeof(eattr));
|
|
||||||
|
|
||||||
l->next = NULL;
|
|
||||||
l->flags = EALF_SORTED;
|
|
||||||
l->count = 1;
|
|
||||||
l->attrs[0].id = da.ea_code;
|
|
||||||
l->attrs[0].flags = 0;
|
|
||||||
l->attrs[0].type = EAF_TYPE_UNDEF | EAF_ORIGINATED | EAF_FRESH;
|
|
||||||
l->attrs[0].u.data = 0;
|
|
||||||
|
|
||||||
f_rta_cow(fs);
|
f_rta_cow(fs);
|
||||||
l->next = *fs->eattrs;
|
ea_unset_attr(fs->eattrs, fs->pool, 1, da.ea_code);
|
||||||
*fs->eattrs = l;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
INST(FI_LENGTH, 1, 1) { /* Get length of */
|
INST(FI_LENGTH, 1, 1) { /* Get length of */
|
||||||
|
109
lib/slab.c
109
lib/slab.c
@ -32,6 +32,7 @@
|
|||||||
#include "nest/bird.h"
|
#include "nest/bird.h"
|
||||||
#include "lib/resource.h"
|
#include "lib/resource.h"
|
||||||
#include "lib/string.h"
|
#include "lib/string.h"
|
||||||
|
#include "lib/tlists.h"
|
||||||
|
|
||||||
#undef FAKE_SLAB /* Turn on if you want to debug memory allocations */
|
#undef FAKE_SLAB /* Turn on if you want to debug memory allocations */
|
||||||
|
|
||||||
@ -153,11 +154,38 @@ slab_memsize(resource *r)
|
|||||||
|
|
||||||
#define MAX_EMPTY_HEADS 1
|
#define MAX_EMPTY_HEADS 1
|
||||||
|
|
||||||
|
enum sl_head_state {
|
||||||
|
slh_empty = 2,
|
||||||
|
slh_partial = 0,
|
||||||
|
slh_full = 1,
|
||||||
|
} PACKED;
|
||||||
|
|
||||||
|
struct sl_head {
|
||||||
|
struct slab *slab;
|
||||||
|
TLIST_NODE(sl_head, struct sl_head) n;
|
||||||
|
u16 num_full;
|
||||||
|
enum sl_head_state state;
|
||||||
|
u32 used_bits[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sl_alignment { /* Magic structure for testing of alignment */
|
||||||
|
byte data;
|
||||||
|
int x[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TLIST_PREFIX sl_head
|
||||||
|
#define TLIST_TYPE struct sl_head
|
||||||
|
#define TLIST_ITEM n
|
||||||
|
#define TLIST_WANT_WALK
|
||||||
|
#define TLIST_WANT_ADD_HEAD
|
||||||
|
|
||||||
|
#include "lib/tlists.h"
|
||||||
|
|
||||||
struct slab {
|
struct slab {
|
||||||
resource r;
|
resource r;
|
||||||
uint obj_size, head_size, head_bitfield_len;
|
uint obj_size, head_size, head_bitfield_len;
|
||||||
uint objs_per_slab, num_empty_heads, data_size;
|
uint objs_per_slab, num_empty_heads, data_size;
|
||||||
list empty_heads, partial_heads, full_heads;
|
struct sl_head_list empty_heads, partial_heads, full_heads;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resclass sl_class = {
|
static struct resclass sl_class = {
|
||||||
@ -169,20 +197,16 @@ static struct resclass sl_class = {
|
|||||||
slab_memsize
|
slab_memsize
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sl_head {
|
|
||||||
struct slab *slab;
|
|
||||||
node n;
|
|
||||||
u32 num_full;
|
|
||||||
u32 used_bits[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sl_alignment { /* Magic structure for testing of alignment */
|
|
||||||
byte data;
|
|
||||||
int x[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
#define SL_GET_HEAD(x) ((struct sl_head *) (((uintptr_t) (x)) & ~(page_size-1)))
|
#define SL_GET_HEAD(x) ((struct sl_head *) (((uintptr_t) (x)) & ~(page_size-1)))
|
||||||
|
|
||||||
|
#define SL_HEAD_CHANGE_STATE(_s, _h, _from, _to) ({ \
|
||||||
|
ASSERT_DIE(_h->state == slh_##_from); \
|
||||||
|
sl_head_rem_node(&_s->_from##_heads, _h); \
|
||||||
|
sl_head_add_head(&_s->_to##_heads, _h); \
|
||||||
|
_h->state = slh_##_to; \
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sl_new - create a new Slab
|
* sl_new - create a new Slab
|
||||||
* @p: resource pool
|
* @p: resource pool
|
||||||
@ -218,9 +242,6 @@ sl_new(pool *p, uint size)
|
|||||||
bug("Slab: object too large");
|
bug("Slab: object too large");
|
||||||
s->num_empty_heads = 0;
|
s->num_empty_heads = 0;
|
||||||
|
|
||||||
init_list(&s->empty_heads);
|
|
||||||
init_list(&s->partial_heads);
|
|
||||||
init_list(&s->full_heads);
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,8 +258,7 @@ sl_alloc(slab *s)
|
|||||||
struct sl_head *h;
|
struct sl_head *h;
|
||||||
|
|
||||||
redo:
|
redo:
|
||||||
h = SKIP_BACK(struct sl_head, n, HEAD(s->partial_heads));
|
if (!(h = s->partial_heads.first))
|
||||||
if (!h->n.next)
|
|
||||||
goto no_partial;
|
goto no_partial;
|
||||||
okay:
|
okay:
|
||||||
for (uint i=0; i<s->head_bitfield_len; i++)
|
for (uint i=0; i<s->head_bitfield_len; i++)
|
||||||
@ -258,16 +278,13 @@ okay:
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
rem_node(&h->n);
|
SL_HEAD_CHANGE_STATE(s, h, partial, full);
|
||||||
add_tail(&s->full_heads, &h->n);
|
|
||||||
goto redo;
|
goto redo;
|
||||||
|
|
||||||
no_partial:
|
no_partial:
|
||||||
h = SKIP_BACK(struct sl_head, n, HEAD(s->empty_heads));
|
if (h = s->empty_heads.first)
|
||||||
if (h->n.next)
|
|
||||||
{
|
{
|
||||||
rem_node(&h->n);
|
SL_HEAD_CHANGE_STATE(s, h, empty, partial);
|
||||||
add_head(&s->partial_heads, &h->n);
|
|
||||||
s->num_empty_heads--;
|
s->num_empty_heads--;
|
||||||
goto okay;
|
goto okay;
|
||||||
}
|
}
|
||||||
@ -281,7 +298,7 @@ no_partial:
|
|||||||
|
|
||||||
memset(h, 0, s->head_size);
|
memset(h, 0, s->head_size);
|
||||||
h->slab = s;
|
h->slab = s;
|
||||||
add_head(&s->partial_heads, &h->n);
|
sl_head_add_head(&s->partial_heads, h);
|
||||||
goto okay;
|
goto okay;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -326,14 +343,11 @@ sl_free(void *oo)
|
|||||||
|
|
||||||
h->used_bits[pos / 32] &= ~(1 << (pos % 32));
|
h->used_bits[pos / 32] &= ~(1 << (pos % 32));
|
||||||
|
|
||||||
if (h->num_full-- == s->objs_per_slab)
|
if ((h->num_full-- == s->objs_per_slab) && (h->state == slh_full))
|
||||||
{
|
SL_HEAD_CHANGE_STATE(s, h, full, partial);
|
||||||
rem_node(&h->n);
|
|
||||||
add_head(&s->partial_heads, &h->n);
|
|
||||||
}
|
|
||||||
else if (!h->num_full)
|
else if (!h->num_full)
|
||||||
{
|
{
|
||||||
rem_node(&h->n);
|
sl_head_rem_node(&s->partial_heads, h);
|
||||||
if (s->num_empty_heads >= MAX_EMPTY_HEADS)
|
if (s->num_empty_heads >= MAX_EMPTY_HEADS)
|
||||||
{
|
{
|
||||||
#ifdef POISON
|
#ifdef POISON
|
||||||
@ -343,7 +357,8 @@ sl_free(void *oo)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
add_head(&s->empty_heads, &h->n);
|
sl_head_add_head(&s->empty_heads, h);
|
||||||
|
h->state = slh_empty;
|
||||||
s->num_empty_heads++;
|
s->num_empty_heads++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -353,14 +368,12 @@ static void
|
|||||||
slab_free(resource *r)
|
slab_free(resource *r)
|
||||||
{
|
{
|
||||||
slab *s = (slab *) r;
|
slab *s = (slab *) r;
|
||||||
struct sl_head *h;
|
|
||||||
node *nn, *nxt;
|
|
||||||
|
|
||||||
WALK_LIST2_DELSAFE(h, nn, nxt, s->empty_heads, n)
|
WALK_TLIST_DELSAFE(sl_head, h, &s->empty_heads)
|
||||||
free_page(h);
|
free_page(h);
|
||||||
WALK_LIST2_DELSAFE(h, nn, nxt, s->partial_heads, n)
|
WALK_TLIST_DELSAFE(sl_head, h, &s->partial_heads)
|
||||||
free_page(h);
|
free_page(h);
|
||||||
WALK_LIST2_DELSAFE(h, nn, nxt, s->full_heads, n)
|
WALK_TLIST_DELSAFE(sl_head, h, &s->full_heads)
|
||||||
free_page(h);
|
free_page(h);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -369,14 +382,12 @@ slab_dump(resource *r)
|
|||||||
{
|
{
|
||||||
slab *s = (slab *) r;
|
slab *s = (slab *) r;
|
||||||
int ec=0, pc=0, fc=0;
|
int ec=0, pc=0, fc=0;
|
||||||
struct sl_head *h;
|
|
||||||
node *nn;
|
|
||||||
|
|
||||||
WALK_LIST2(h, nn, s->empty_heads, n)
|
WALK_TLIST(sl_head, h, &s->empty_heads)
|
||||||
ec++;
|
ec++;
|
||||||
WALK_LIST2(h, nn, s->partial_heads, n)
|
WALK_TLIST(sl_head, h, &s->partial_heads)
|
||||||
pc++;
|
pc++;
|
||||||
WALK_LIST2(h, nn, s->full_heads, n)
|
WALK_TLIST(sl_head, h, &s->full_heads)
|
||||||
fc++;
|
fc++;
|
||||||
debug("(%de+%dp+%df blocks per %d objs per %d bytes)\n", ec, pc, fc, s->objs_per_slab, s->obj_size);
|
debug("(%de+%dp+%df blocks per %d objs per %d bytes)\n", ec, pc, fc, s->objs_per_slab, s->obj_size);
|
||||||
}
|
}
|
||||||
@ -386,21 +397,19 @@ slab_memsize(resource *r)
|
|||||||
{
|
{
|
||||||
slab *s = (slab *) r;
|
slab *s = (slab *) r;
|
||||||
size_t heads = 0;
|
size_t heads = 0;
|
||||||
struct sl_head *h;
|
|
||||||
node *nn;
|
|
||||||
|
|
||||||
WALK_LIST2(h, nn, s->full_heads, n)
|
WALK_TLIST(sl_head, h, &s->full_heads)
|
||||||
heads++;
|
heads++;
|
||||||
|
|
||||||
size_t items = heads * s->objs_per_slab;
|
size_t items = heads * s->objs_per_slab;
|
||||||
|
|
||||||
WALK_LIST2(h, nn, s->partial_heads, n)
|
WALK_TLIST(sl_head, h, &s->partial_heads)
|
||||||
{
|
{
|
||||||
heads++;
|
heads++;
|
||||||
items += h->num_full;
|
items += h->num_full;
|
||||||
}
|
}
|
||||||
|
|
||||||
WALK_LIST2(h, nn, s->empty_heads, n)
|
WALK_TLIST(sl_head, h, &s->empty_heads)
|
||||||
heads++;
|
heads++;
|
||||||
|
|
||||||
size_t eff = items * s->data_size;
|
size_t eff = items * s->data_size;
|
||||||
@ -415,13 +424,11 @@ static resource *
|
|||||||
slab_lookup(resource *r, unsigned long a)
|
slab_lookup(resource *r, unsigned long a)
|
||||||
{
|
{
|
||||||
slab *s = (slab *) r;
|
slab *s = (slab *) r;
|
||||||
struct sl_head *h;
|
|
||||||
node *nn;
|
|
||||||
|
|
||||||
WALK_LIST2(h, nn, s->partial_heads, n)
|
WALK_TLIST(sl_head, h, &s->partial_heads)
|
||||||
if ((unsigned long) h < a && (unsigned long) h + page_size < a)
|
if ((unsigned long) h < a && (unsigned long) h + page_size < a)
|
||||||
return r;
|
return r;
|
||||||
WALK_LIST2(h, nn, s->full_heads, n)
|
WALK_TLIST(sl_head, h, &s->full_heads)
|
||||||
if ((unsigned long) h < a && (unsigned long) h + page_size < a)
|
if ((unsigned long) h < a && (unsigned long) h + page_size < a)
|
||||||
return r;
|
return r;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
src := a-path.c a-set.c cli.c cmds.c iface.c locks.c neighbor.c password.c proto.c rt-attr.c rt-dev.c rt-fib.c rt-show.c rt-table.c
|
src := a-path.c a-set.c cli.c cmds.c iface.c locks.c neighbor.c password.c proto.c proto-build.c rt-attr.c rt-dev.c rt-fib.c rt-show.c rt-table.c
|
||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,dev_build)
|
||||||
|
|
||||||
|
$(proto-build-c): $(lastword $(MAKEFILE_LIST))
|
||||||
|
$(E)echo GEN $@
|
||||||
|
$(Q)echo "$(patsubst %,void %(void); ,$(PROTO_BUILD)) void protos_build_gen(void) { $(patsubst %, %(); ,$(PROTO_BUILD))}" > $@
|
||||||
|
|
||||||
tests_src := a-set_test.c a-path_test.c
|
tests_src := a-set_test.c a-path_test.c
|
||||||
tests_targets := $(tests_targets) $(tests-target-files)
|
tests_targets := $(tests_targets) $(tests-target-files)
|
||||||
|
@ -591,7 +591,7 @@ as_path_match_set(const struct adata *path, const struct f_tree *set)
|
|||||||
p += 2;
|
p += 2;
|
||||||
for (i=0; i<n; i++)
|
for (i=0; i<n; i++)
|
||||||
{
|
{
|
||||||
struct f_val v = {T_INT, .val.i = get_as(p)};
|
struct f_val v = { .type = T_INT, .val.i = get_as(p)};
|
||||||
if (find_tree(set, &v))
|
if (find_tree(set, &v))
|
||||||
return 1;
|
return 1;
|
||||||
p += BS;
|
p += BS;
|
||||||
@ -631,7 +631,7 @@ as_path_filter(struct linpool *pool, const struct adata *path, const struct f_tr
|
|||||||
|
|
||||||
if (set)
|
if (set)
|
||||||
{
|
{
|
||||||
struct f_val v = {T_INT, .val.i = as};
|
struct f_val v = { .type = T_INT, .val.i = as};
|
||||||
match = !!find_tree(set, &v);
|
match = !!find_tree(set, &v);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
45
nest/proto.c
45
nest/proto.c
@ -23,9 +23,9 @@
|
|||||||
#include "filter/f-inst.h"
|
#include "filter/f-inst.h"
|
||||||
|
|
||||||
pool *proto_pool;
|
pool *proto_pool;
|
||||||
list proto_list;
|
list STATIC_LIST_INIT(proto_list);
|
||||||
|
|
||||||
static list protocol_list;
|
static list STATIC_LIST_INIT(protocol_list);
|
||||||
struct protocol *class_to_protocol[PROTOCOL__MAX];
|
struct protocol *class_to_protocol[PROTOCOL__MAX];
|
||||||
|
|
||||||
#define CD(c, msg, args...) ({ if (c->debug & D_STATES) log(L_TRACE "%s.%s: " msg, c->proto->name, c->name ?: "?", ## args); })
|
#define CD(c, msg, args...) ({ if (c->debug & D_STATES) log(L_TRACE "%s.%s: " msg, c->proto->name, c->name ?: "?", ## args); })
|
||||||
@ -1757,6 +1757,8 @@ proto_build(struct protocol *p)
|
|||||||
/* FIXME: convert this call to some protocol hook */
|
/* FIXME: convert this call to some protocol hook */
|
||||||
extern void bfd_init_all(void);
|
extern void bfd_init_all(void);
|
||||||
|
|
||||||
|
void protos_build_gen(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* protos_build - build a protocol list
|
* protos_build - build a protocol list
|
||||||
*
|
*
|
||||||
@ -1769,44 +1771,7 @@ extern void bfd_init_all(void);
|
|||||||
void
|
void
|
||||||
protos_build(void)
|
protos_build(void)
|
||||||
{
|
{
|
||||||
init_list(&proto_list);
|
protos_build_gen();
|
||||||
init_list(&protocol_list);
|
|
||||||
|
|
||||||
proto_build(&proto_device);
|
|
||||||
#ifdef CONFIG_RADV
|
|
||||||
proto_build(&proto_radv);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_RIP
|
|
||||||
proto_build(&proto_rip);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_STATIC
|
|
||||||
proto_build(&proto_static);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_MRT
|
|
||||||
proto_build(&proto_mrt);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_OSPF
|
|
||||||
proto_build(&proto_ospf);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_PIPE
|
|
||||||
proto_build(&proto_pipe);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_BGP
|
|
||||||
proto_build(&proto_bgp);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_BFD
|
|
||||||
proto_build(&proto_bfd);
|
|
||||||
bfd_init_all();
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_BABEL
|
|
||||||
proto_build(&proto_babel);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_RPKI
|
|
||||||
proto_build(&proto_rpki);
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_PERF
|
|
||||||
proto_build(&proto_perf);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
proto_pool = rp_new(&root_pool, "Protocols");
|
proto_pool = rp_new(&root_pool, "Protocols");
|
||||||
proto_shutdown_timer = tm_new(proto_pool);
|
proto_shutdown_timer = tm_new(proto_pool);
|
||||||
|
@ -84,8 +84,8 @@ struct protocol {
|
|||||||
void (*copy_config)(struct proto_config *, struct proto_config *); /* Copy config from given protocol instance */
|
void (*copy_config)(struct proto_config *, struct proto_config *); /* Copy config from given protocol instance */
|
||||||
};
|
};
|
||||||
|
|
||||||
void protos_build(void);
|
void protos_build(void); /* Called from sysdep to initialize protocols */
|
||||||
void proto_build(struct protocol *);
|
void proto_build(struct protocol *); /* Called from protocol to register itself */
|
||||||
void protos_preconfig(struct config *);
|
void protos_preconfig(struct config *);
|
||||||
void protos_commit(struct config *new, struct config *old, int force_restart, int type);
|
void protos_commit(struct config *new, struct config *old, int force_restart, int type);
|
||||||
struct proto * proto_spawn(struct proto_config *cf, uint disabled);
|
struct proto * proto_spawn(struct proto_config *cf, uint disabled);
|
||||||
|
57
nest/route.h
57
nest/route.h
@ -664,7 +664,10 @@ static inline int rte_is_reachable(rte *r)
|
|||||||
typedef struct eattr {
|
typedef struct eattr {
|
||||||
word id; /* EA_CODE(PROTOCOL_..., protocol-dependent ID) */
|
word id; /* EA_CODE(PROTOCOL_..., protocol-dependent ID) */
|
||||||
byte flags; /* Protocol-dependent flags */
|
byte flags; /* Protocol-dependent flags */
|
||||||
byte type; /* Attribute type and several flags (EAF_...) */
|
byte type:5; /* Attribute type */
|
||||||
|
byte originated:1; /* The attribute has originated locally */
|
||||||
|
byte fresh:1; /* An uncached attribute (e.g. modified in export filter) */
|
||||||
|
byte undef:1; /* Explicitly undefined */
|
||||||
union {
|
union {
|
||||||
uintptr_t data;
|
uintptr_t data;
|
||||||
const struct adata *ptr; /* Attribute data elsewhere */
|
const struct adata *ptr; /* Attribute data elsewhere */
|
||||||
@ -700,11 +703,8 @@ const char *ea_custom_name(uint ea);
|
|||||||
#define EAF_TYPE_PTR 0x0d /* Pointer to an object */
|
#define EAF_TYPE_PTR 0x0d /* Pointer to an object */
|
||||||
#define EAF_TYPE_EC_SET 0x0e /* Set of pairs of u32's - ext. community list */
|
#define EAF_TYPE_EC_SET 0x0e /* Set of pairs of u32's - ext. community list */
|
||||||
#define EAF_TYPE_LC_SET 0x12 /* Set of triplets of u32's - large community list */
|
#define EAF_TYPE_LC_SET 0x12 /* Set of triplets of u32's - large community list */
|
||||||
#define EAF_TYPE_UNDEF 0x1f /* `force undefined' entry */
|
|
||||||
#define EAF_EMBEDDED 0x01 /* Data stored in eattr.u.data (part of type spec) */
|
#define EAF_EMBEDDED 0x01 /* Data stored in eattr.u.data (part of type spec) */
|
||||||
#define EAF_VAR_LENGTH 0x02 /* Attribute length is variable (part of type spec) */
|
#define EAF_VAR_LENGTH 0x02 /* Attribute length is variable (part of type spec) */
|
||||||
#define EAF_ORIGINATED 0x20 /* The attribute has originated locally */
|
|
||||||
#define EAF_FRESH 0x40 /* An uncached attribute (e.g. modified in export filter) */
|
|
||||||
|
|
||||||
typedef struct adata {
|
typedef struct adata {
|
||||||
uint length; /* Length of data */
|
uint length; /* Length of data */
|
||||||
@ -772,27 +772,50 @@ void ea_format_bitfield(const struct eattr *a, byte *buf, int bufsize, const cha
|
|||||||
ea = NULL; \
|
ea = NULL; \
|
||||||
} while(0) \
|
} while(0) \
|
||||||
|
|
||||||
|
struct ea_one_attr_list {
|
||||||
|
ea_list l;
|
||||||
|
eattr a;
|
||||||
|
};
|
||||||
|
|
||||||
static inline eattr *
|
static inline eattr *
|
||||||
ea_set_attr(ea_list **to, struct linpool *pool, uint id, uint flags, uint type, uintptr_t val)
|
ea_set_attr(ea_list **to, struct linpool *pool, uint id, uint flags, uint type, uintptr_t val)
|
||||||
{
|
{
|
||||||
ea_list *a = lp_alloc(pool, sizeof(ea_list) + sizeof(eattr));
|
struct ea_one_attr_list *ea = lp_alloc(pool, sizeof(*ea));
|
||||||
eattr *e = &a->attrs[0];
|
*ea = (struct ea_one_attr_list) {
|
||||||
|
.l.flags = EALF_SORTED,
|
||||||
|
.l.count = 1,
|
||||||
|
.l.next = *to,
|
||||||
|
|
||||||
a->flags = EALF_SORTED;
|
.a.id = id,
|
||||||
a->count = 1;
|
.a.type = type,
|
||||||
a->next = *to;
|
.a.flags = flags,
|
||||||
*to = a;
|
};
|
||||||
|
|
||||||
e->id = id;
|
|
||||||
e->type = type;
|
|
||||||
e->flags = flags;
|
|
||||||
|
|
||||||
if (type & EAF_EMBEDDED)
|
if (type & EAF_EMBEDDED)
|
||||||
e->u.data = (u32) val;
|
ea->a.u.data = val;
|
||||||
else
|
else
|
||||||
e->u.ptr = (struct adata *) val;
|
ea->a.u.ptr = (struct adata *) val;
|
||||||
|
|
||||||
return e;
|
*to = &ea->l;
|
||||||
|
|
||||||
|
return &ea->a;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
ea_unset_attr(ea_list **to, struct linpool *pool, _Bool local, uint code)
|
||||||
|
{
|
||||||
|
struct ea_one_attr_list *ea = lp_alloc(pool, sizeof(*ea));
|
||||||
|
*ea = (struct ea_one_attr_list) {
|
||||||
|
.l.flags = EALF_SORTED,
|
||||||
|
.l.count = 1,
|
||||||
|
.l.next = *to,
|
||||||
|
.a.id = code,
|
||||||
|
.a.fresh = local,
|
||||||
|
.a.originated = local,
|
||||||
|
.a.undef = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
*to = &ea->l;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -448,8 +448,7 @@ ea_find(ea_list *e, unsigned id)
|
|||||||
{
|
{
|
||||||
eattr *a = ea__find(e, id & EA_CODE_MASK);
|
eattr *a = ea__find(e, id & EA_CODE_MASK);
|
||||||
|
|
||||||
if (a && (a->type & EAF_TYPE_MASK) == EAF_TYPE_UNDEF &&
|
if (a && a->undef && !(id & EA_ALLOW_UNDEF))
|
||||||
!(id & EA_ALLOW_UNDEF))
|
|
||||||
return NULL;
|
return NULL;
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
@ -516,7 +515,7 @@ ea_walk(struct ea_walk_state *s, uint id, uint max)
|
|||||||
|
|
||||||
BIT32_SET(s->visited, n);
|
BIT32_SET(s->visited, n);
|
||||||
|
|
||||||
if ((a->type & EAF_TYPE_MASK) == EAF_TYPE_UNDEF)
|
if (a->undef)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
s->eattrs = e;
|
s->eattrs = e;
|
||||||
@ -616,14 +615,17 @@ ea_do_prune(ea_list *e)
|
|||||||
|
|
||||||
/* Now s0 is the most recent version, s[-1] the oldest one */
|
/* Now s0 is the most recent version, s[-1] the oldest one */
|
||||||
/* Drop undefs */
|
/* Drop undefs */
|
||||||
if ((s0->type & EAF_TYPE_MASK) == EAF_TYPE_UNDEF)
|
if (s0->undef)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Copy the newest version to destination */
|
/* Copy the newest version to destination */
|
||||||
*d = *s0;
|
*d = *s0;
|
||||||
|
|
||||||
/* Preserve info whether it originated locally */
|
/* Preserve info whether it originated locally */
|
||||||
d->type = (d->type & ~(EAF_ORIGINATED|EAF_FRESH)) | (s[-1].type & EAF_ORIGINATED);
|
d->originated = s[-1].originated;
|
||||||
|
|
||||||
|
/* Not fresh any more, we prefer surstroemming */
|
||||||
|
d->fresh = 0;
|
||||||
|
|
||||||
/* Next destination */
|
/* Next destination */
|
||||||
d++;
|
d++;
|
||||||
@ -737,6 +739,9 @@ ea_same(ea_list *x, ea_list *y)
|
|||||||
if (a->id != b->id ||
|
if (a->id != b->id ||
|
||||||
a->flags != b->flags ||
|
a->flags != b->flags ||
|
||||||
a->type != b->type ||
|
a->type != b->type ||
|
||||||
|
a->originated != b->originated ||
|
||||||
|
a->fresh != b->fresh ||
|
||||||
|
a->undef != b->undef ||
|
||||||
((a->type & EAF_EMBEDDED) ? a->u.data != b->u.data : !adata_same(a->u.ptr, b->u.ptr)))
|
((a->type & EAF_EMBEDDED) ? a->u.data != b->u.data : !adata_same(a->u.ptr, b->u.ptr)))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -939,6 +944,10 @@ ea_show(struct cli *c, const eattr *e)
|
|||||||
{
|
{
|
||||||
*pos++ = ':';
|
*pos++ = ':';
|
||||||
*pos++ = ' ';
|
*pos++ = ' ';
|
||||||
|
|
||||||
|
if (e->undef)
|
||||||
|
bsprintf(pos, "undefined");
|
||||||
|
else
|
||||||
switch (e->type & EAF_TYPE_MASK)
|
switch (e->type & EAF_TYPE_MASK)
|
||||||
{
|
{
|
||||||
case EAF_TYPE_INT:
|
case EAF_TYPE_INT:
|
||||||
@ -968,7 +977,6 @@ ea_show(struct cli *c, const eattr *e)
|
|||||||
case EAF_TYPE_LC_SET:
|
case EAF_TYPE_LC_SET:
|
||||||
ea_show_lc_set(c, ad, pos, buf, end);
|
ea_show_lc_set(c, ad, pos, buf, end);
|
||||||
return;
|
return;
|
||||||
case EAF_TYPE_UNDEF:
|
|
||||||
default:
|
default:
|
||||||
bsprintf(pos, "<type %02x>", e->type);
|
bsprintf(pos, "<type %02x>", e->type);
|
||||||
}
|
}
|
||||||
@ -1004,7 +1012,7 @@ ea_dump(ea_list *e)
|
|||||||
eattr *a = &e->attrs[i];
|
eattr *a = &e->attrs[i];
|
||||||
debug(" %02x:%02x.%02x", EA_PROTO(a->id), EA_ID(a->id), a->flags);
|
debug(" %02x:%02x.%02x", EA_PROTO(a->id), EA_ID(a->id), a->flags);
|
||||||
debug("=%c", "?iO?I?P???S?????" [a->type & EAF_TYPE_MASK]);
|
debug("=%c", "?iO?I?P???S?????" [a->type & EAF_TYPE_MASK]);
|
||||||
if (a->type & EAF_ORIGINATED)
|
if (a->originated)
|
||||||
debug("o");
|
debug("o");
|
||||||
if (a->type & EAF_EMBEDDED)
|
if (a->type & EAF_EMBEDDED)
|
||||||
debug(":%08x", a->u.data);
|
debug(":%08x", a->u.data);
|
||||||
|
@ -194,3 +194,9 @@ struct protocol proto_device = {
|
|||||||
.reconfigure = dev_reconfigure,
|
.reconfigure = dev_reconfigure,
|
||||||
.copy_config = dev_copy_config
|
.copy_config = dev_copy_config
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
dev_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_device);
|
||||||
|
}
|
||||||
|
@ -2,5 +2,6 @@ src := babel.c packets.c
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,babel_build)
|
||||||
|
|
||||||
tests_objs := $(tests_objs) $(src-o-files)
|
tests_objs := $(tests_objs) $(src-o-files)
|
||||||
|
@ -2497,3 +2497,9 @@ struct protocol proto_babel = {
|
|||||||
.get_route_info = babel_get_route_info,
|
.get_route_info = babel_get_route_info,
|
||||||
.get_attr = babel_get_attr
|
.get_attr = babel_get_attr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
babel_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_babel);
|
||||||
|
}
|
||||||
|
@ -2,5 +2,6 @@ src := bfd.c io.c packets.c
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,bfd_build)
|
||||||
|
|
||||||
tests_objs := $(tests_objs) $(src-o-files)
|
tests_objs := $(tests_objs) $(src-o-files)
|
@ -113,8 +113,8 @@
|
|||||||
#define HASH_IP_EQ(a1,n1,a2,n2) ipa_equal(a1, a2) && n1 == n2
|
#define HASH_IP_EQ(a1,n1,a2,n2) ipa_equal(a1, a2) && n1 == n2
|
||||||
#define HASH_IP_FN(a,n) ipa_hash(a) ^ u32_hash(n)
|
#define HASH_IP_FN(a,n) ipa_hash(a) ^ u32_hash(n)
|
||||||
|
|
||||||
static list bfd_proto_list;
|
static list STATIC_LIST_INIT(bfd_proto_list);
|
||||||
static list bfd_wait_list;
|
static list STATIC_LIST_INIT(bfd_wait_list);
|
||||||
|
|
||||||
const char *bfd_state_names[] = { "AdminDown", "Down", "Init", "Up" };
|
const char *bfd_state_names[] = { "AdminDown", "Down", "Init", "Up" };
|
||||||
|
|
||||||
@ -998,13 +998,6 @@ bfd_notify_init(struct bfd_proto *p)
|
|||||||
* BFD protocol glue
|
* BFD protocol glue
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
|
||||||
bfd_init_all(void)
|
|
||||||
{
|
|
||||||
init_list(&bfd_proto_list);
|
|
||||||
init_list(&bfd_wait_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct proto *
|
static struct proto *
|
||||||
bfd_init(struct proto_config *c)
|
bfd_init(struct proto_config *c)
|
||||||
{
|
{
|
||||||
@ -1186,3 +1179,9 @@ struct protocol proto_bfd = {
|
|||||||
.reconfigure = bfd_reconfigure,
|
.reconfigure = bfd_reconfigure,
|
||||||
.copy_config = bfd_copy_config,
|
.copy_config = bfd_copy_config,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
bfd_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_bfd);
|
||||||
|
}
|
||||||
|
@ -2,5 +2,6 @@ src := attrs.c bgp.c packets.c
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,bgp_build)
|
||||||
|
|
||||||
tests_objs := $(tests_objs) $(src-o-files)
|
tests_objs := $(tests_objs) $(src-o-files)
|
@ -106,7 +106,7 @@ bgp_set_attr(ea_list **attrs, struct linpool *pool, uint code, uint flags, uintp
|
|||||||
({ REPORT(msg, ## args); s->err_withdraw = 1; return; })
|
({ REPORT(msg, ## args); s->err_withdraw = 1; return; })
|
||||||
|
|
||||||
#define UNSET(a) \
|
#define UNSET(a) \
|
||||||
({ a->type = EAF_TYPE_UNDEF; return; })
|
({ a->undef = 1; return; })
|
||||||
|
|
||||||
#define REJECT(msg, args...) \
|
#define REJECT(msg, args...) \
|
||||||
({ log(L_ERR "%s: " msg, s->proto->p.name, ## args); s->err_reject = 1; return; })
|
({ log(L_ERR "%s: " msg, s->proto->p.name, ## args); s->err_reject = 1; return; })
|
||||||
@ -1153,7 +1153,7 @@ bgp_export_attr(struct bgp_export_state *s, eattr *a, ea_list *to)
|
|||||||
a->flags = (a->flags & BAF_PARTIAL) | desc->flags;
|
a->flags = (a->flags & BAF_PARTIAL) | desc->flags;
|
||||||
|
|
||||||
/* Set partial bit if new opt-trans attribute is attached to non-local route */
|
/* Set partial bit if new opt-trans attribute is attached to non-local route */
|
||||||
if ((s->src != NULL) && (a->type & EAF_ORIGINATED) &&
|
if ((s->src != NULL) && (a->originated) &&
|
||||||
(a->flags & BAF_OPTIONAL) && (a->flags & BAF_TRANSITIVE))
|
(a->flags & BAF_OPTIONAL) && (a->flags & BAF_TRANSITIVE))
|
||||||
a->flags |= BAF_PARTIAL;
|
a->flags |= BAF_PARTIAL;
|
||||||
|
|
||||||
@ -1161,7 +1161,7 @@ bgp_export_attr(struct bgp_export_state *s, eattr *a, ea_list *to)
|
|||||||
CALL(desc->export, s, a);
|
CALL(desc->export, s, a);
|
||||||
|
|
||||||
/* Attribute might become undefined in hook */
|
/* Attribute might become undefined in hook */
|
||||||
if ((a->type & EAF_TYPE_MASK) == EAF_TYPE_UNDEF)
|
if (a->undef)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1776,7 +1776,7 @@ bgp_update_attrs(struct bgp_proto *p, struct bgp_channel *c, rte *e, ea_list *at
|
|||||||
|
|
||||||
/* MULTI_EXIT_DESC attribute - accept only if set in export filter */
|
/* MULTI_EXIT_DESC attribute - accept only if set in export filter */
|
||||||
a = bgp_find_attr(attrs0, BA_MULTI_EXIT_DISC);
|
a = bgp_find_attr(attrs0, BA_MULTI_EXIT_DISC);
|
||||||
if (a && !(a->type & EAF_FRESH))
|
if (a && !(a->fresh))
|
||||||
bgp_unset_attr(&attrs, pool, BA_MULTI_EXIT_DISC);
|
bgp_unset_attr(&attrs, pool, BA_MULTI_EXIT_DISC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2592,3 +2592,8 @@ struct protocol proto_bgp = {
|
|||||||
.get_route_info = bgp_get_route_info,
|
.get_route_info = bgp_get_route_info,
|
||||||
.show_proto_info = bgp_show_proto_info
|
.show_proto_info = bgp_show_proto_info
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void bgp_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_bgp);
|
||||||
|
}
|
||||||
|
@ -563,9 +563,7 @@ bgp_set_attr_data(ea_list **to, struct linpool *pool, uint code, uint flags, voi
|
|||||||
bgp_set_attr(to, pool, code, flags, (uintptr_t) a);
|
bgp_set_attr(to, pool, code, flags, (uintptr_t) a);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
#define bgp_unset_attr(to, pool, code) ea_unset_attr(to, pool, 0, code)
|
||||||
bgp_unset_attr(ea_list **to, struct linpool *pool, uint code)
|
|
||||||
{ eattr *e = bgp_set_attr(to, pool, code, 0, 0); e->type = EAF_TYPE_UNDEF; }
|
|
||||||
|
|
||||||
int bgp_encode_mp_reach_mrt(struct bgp_write_state *s, eattr *a, byte *buf, uint size);
|
int bgp_encode_mp_reach_mrt(struct bgp_write_state *s, eattr *a, byte *buf, uint size);
|
||||||
|
|
||||||
|
@ -1062,7 +1062,7 @@ bgp_use_next_hop(struct bgp_export_state *s, eattr *a)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Keep it when explicitly set in export filter */
|
/* Keep it when explicitly set in export filter */
|
||||||
if (a->type & EAF_FRESH)
|
if (a->fresh)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Check for non-matching AF */
|
/* Check for non-matching AF */
|
||||||
|
@ -2,5 +2,6 @@ src := mrt.c
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,mrt_build)
|
||||||
|
|
||||||
tests_objs := $(tests_objs) $(src-o-files)
|
tests_objs := $(tests_objs) $(src-o-files)
|
@ -913,3 +913,9 @@ struct protocol proto_mrt = {
|
|||||||
.reconfigure = mrt_reconfigure,
|
.reconfigure = mrt_reconfigure,
|
||||||
.copy_config = mrt_copy_config,
|
.copy_config = mrt_copy_config,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
mrt_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_mrt);
|
||||||
|
}
|
||||||
|
@ -2,5 +2,6 @@ src := dbdes.c hello.c iface.c lsack.c lsalib.c lsreq.c lsupd.c neighbor.c ospf.
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,ospf_build)
|
||||||
|
|
||||||
tests_objs := $(tests_objs) $(src-o-files)
|
tests_objs := $(tests_objs) $(src-o-files)
|
@ -1534,3 +1534,9 @@ struct protocol proto_ospf = {
|
|||||||
.get_attr = ospf_get_attr,
|
.get_attr = ospf_get_attr,
|
||||||
.get_route_info = ospf_get_route_info
|
.get_route_info = ospf_get_route_info
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
ospf_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_ospf);
|
||||||
|
}
|
||||||
|
@ -2,5 +2,6 @@ src := perf.c
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,perf_build)
|
||||||
|
|
||||||
tests_objs := $(tests_objs) $(src-o-files)
|
tests_objs := $(tests_objs) $(src-o-files)
|
||||||
|
@ -314,3 +314,9 @@ struct protocol proto_perf = {
|
|||||||
.reconfigure = perf_reconfigure,
|
.reconfigure = perf_reconfigure,
|
||||||
.copy_config = perf_copy_config,
|
.copy_config = perf_copy_config,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
perf_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_perf);
|
||||||
|
}
|
||||||
|
@ -2,5 +2,6 @@ src := pipe.c
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,pipe_build)
|
||||||
|
|
||||||
tests_objs := $(tests_objs) $(src-o-files)
|
tests_objs := $(tests_objs) $(src-o-files)
|
@ -309,3 +309,9 @@ struct protocol proto_pipe = {
|
|||||||
.get_status = pipe_get_status,
|
.get_status = pipe_get_status,
|
||||||
.show_proto_info = pipe_show_proto_info
|
.show_proto_info = pipe_show_proto_info
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
pipe_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_pipe);
|
||||||
|
}
|
||||||
|
@ -2,5 +2,6 @@ src := packets.c radv.c
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,radv_build)
|
||||||
|
|
||||||
tests_objs := $(tests_objs) $(src-o-files)
|
tests_objs := $(tests_objs) $(src-o-files)
|
@ -771,3 +771,9 @@ struct protocol proto_radv = {
|
|||||||
.get_status = radv_get_status,
|
.get_status = radv_get_status,
|
||||||
.get_attr = radv_get_attr
|
.get_attr = radv_get_attr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
radv_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_radv);
|
||||||
|
}
|
||||||
|
@ -2,5 +2,6 @@ src := packets.c rip.c
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,rip_build)
|
||||||
|
|
||||||
tests_objs := $(tests_objs) $(src-o-files)
|
tests_objs := $(tests_objs) $(src-o-files)
|
@ -1341,3 +1341,9 @@ struct protocol proto_rip = {
|
|||||||
.get_route_info = rip_get_route_info,
|
.get_route_info = rip_get_route_info,
|
||||||
.get_attr = rip_get_attr
|
.get_attr = rip_get_attr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
rip_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_rip);
|
||||||
|
}
|
||||||
|
@ -2,5 +2,6 @@ src := rpki.c packets.c tcp_transport.c ssh_transport.c transport.c
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,rpki_build)
|
||||||
|
|
||||||
tests_objs := $(tests_objs) $(src-o-files)
|
tests_objs := $(tests_objs) $(src-o-files)
|
@ -955,3 +955,9 @@ struct protocol proto_rpki = {
|
|||||||
.reconfigure = rpki_reconfigure,
|
.reconfigure = rpki_reconfigure,
|
||||||
.get_status = rpki_get_status,
|
.get_status = rpki_get_status,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
rpki_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_rpki);
|
||||||
|
}
|
||||||
|
@ -2,5 +2,6 @@ src := static.c
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,static_build)
|
||||||
|
|
||||||
tests_objs := $(tests_objs) $(src-o-files)
|
tests_objs := $(tests_objs) $(src-o-files)
|
@ -775,3 +775,9 @@ struct protocol proto_static = {
|
|||||||
.copy_config = static_copy_config,
|
.copy_config = static_copy_config,
|
||||||
.get_route_info = static_get_route_info,
|
.get_route_info = static_get_route_info,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
static_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_static);
|
||||||
|
}
|
||||||
|
@ -2,6 +2,8 @@ src := alloc.c io.c krt.c log.c main.c random.c
|
|||||||
obj := $(src-o-files)
|
obj := $(src-o-files)
|
||||||
$(all-daemon)
|
$(all-daemon)
|
||||||
$(cf-local)
|
$(cf-local)
|
||||||
|
$(call proto-build,kif_build)
|
||||||
|
$(call proto-build,krt_build)
|
||||||
$(conf-y-targets): $(s)krt.Y
|
$(conf-y-targets): $(s)krt.Y
|
||||||
|
|
||||||
src := $(filter-out main.c, $(src))
|
src := $(filter-out main.c, $(src))
|
||||||
|
@ -243,6 +243,13 @@ struct protocol proto_unix_iface = {
|
|||||||
.copy_config = kif_copy_config
|
.copy_config = kif_copy_config
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
kif_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_unix_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tracing of routes
|
* Tracing of routes
|
||||||
*/
|
*/
|
||||||
@ -1186,3 +1193,9 @@ struct protocol proto_unix_kernel = {
|
|||||||
.dump = krt_dump,
|
.dump = krt_dump,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
krt_build(void)
|
||||||
|
{
|
||||||
|
proto_build(&proto_unix_kernel);
|
||||||
|
}
|
||||||
|
@ -906,8 +906,6 @@ main(int argc, char **argv)
|
|||||||
open_pid_file();
|
open_pid_file();
|
||||||
|
|
||||||
protos_build();
|
protos_build();
|
||||||
proto_build(&proto_unix_kernel);
|
|
||||||
proto_build(&proto_unix_iface);
|
|
||||||
|
|
||||||
struct config *conf = read_config();
|
struct config *conf = read_config();
|
||||||
|
|
||||||
|
@ -68,8 +68,6 @@ bt_bird_init(void)
|
|||||||
config_init();
|
config_init();
|
||||||
|
|
||||||
protos_build();
|
protos_build();
|
||||||
proto_build(&proto_unix_kernel);
|
|
||||||
proto_build(&proto_unix_iface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bt_bird_cleanup(void)
|
void bt_bird_cleanup(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user