From 39c028e9e9e3acf840051f4271fadd4939fde2af Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Tue, 24 Jan 2012 11:31:00 +0100 Subject: [PATCH] Assign default protocol preference via proto_config_new(). The patch from Alexander V. Chernikov. --- nest/config.Y | 1 - nest/proto.c | 1 + nest/protocol.h | 1 + nest/rt-dev.c | 1 + proto/bgp/bgp.c | 1 + proto/bgp/config.Y | 1 - proto/ospf/config.Y | 1 - proto/ospf/ospf.c | 1 + proto/pipe/config.Y | 1 - proto/pipe/pipe.c | 1 + proto/rip/rip.c | 2 +- proto/static/static.c | 2 +- sysdep/unix/krt.Y | 2 -- sysdep/unix/krt.c | 2 ++ 14 files changed, 10 insertions(+), 8 deletions(-) diff --git a/nest/config.Y b/nest/config.Y index a6baf4ea..3fcfa528 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -219,7 +219,6 @@ CF_ADDTO(proto, dev_proto '}') dev_proto_start: proto_start DIRECT { this_proto = proto_config_new(&proto_device, sizeof(struct rt_dev_config), $1); - this_proto->preference = DEF_PREF_DIRECT; init_list(&DIRECT_CFG->iface_list); } ; diff --git a/nest/proto.c b/nest/proto.c index d55c348d..0fc72ce1 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -200,6 +200,7 @@ proto_config_new(struct protocol *pr, unsigned size, int class) c->global = new_config; c->protocol = pr; c->name = pr->name; + c->preference = pr->preference; c->class = class; c->out_filter = FILTER_REJECT; c->table = c->global->master_rtc; diff --git a/nest/protocol.h b/nest/protocol.h index 3766e15e..a83c4ffc 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -39,6 +39,7 @@ struct protocol { char *template; /* Template for automatic generation of names */ int name_counter; /* Counter for automatic name generation */ int attr_class; /* Attribute class known to this protocol */ + unsigned preference; /* Default protocol preference */ void (*preconfig)(struct protocol *, struct config *); /* Just before configuring */ void (*postconfig)(struct proto_config *); /* After configuring each instance */ diff --git a/nest/rt-dev.c b/nest/rt-dev.c index 497ee808..54cb14ba 100644 --- a/nest/rt-dev.c +++ b/nest/rt-dev.c @@ -109,6 +109,7 @@ dev_copy_config(struct proto_config *dest, struct proto_config *src) struct protocol proto_device = { name: "Direct", template: "direct%d", + preference: DEF_PREF_DIRECT, init: dev_init, reconfigure: dev_reconfigure, copy_config: dev_copy_config diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index 66fdc603..4d3c32fb 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -1178,6 +1178,7 @@ struct protocol proto_bgp = { name: "BGP", template: "bgp%d", attr_class: EAP_BGP, + preference: DEF_PREF_BGP, init: bgp_init, start: bgp_start, shutdown: bgp_shutdown, diff --git a/proto/bgp/config.Y b/proto/bgp/config.Y index 5fb60940..78ca52de 100644 --- a/proto/bgp/config.Y +++ b/proto/bgp/config.Y @@ -33,7 +33,6 @@ CF_ADDTO(proto, bgp_proto '}' { bgp_check_config(BGP_CFG); } ) bgp_proto_start: proto_start BGP { this_proto = proto_config_new(&proto_bgp, sizeof(struct bgp_config), $1); - this_proto->preference = DEF_PREF_BGP; BGP_CFG->hold_time = 240; BGP_CFG->connect_retry_time = 120; BGP_CFG->initial_hold_time = 240; diff --git a/proto/ospf/config.Y b/proto/ospf/config.Y index 4ada41e8..24e125a7 100644 --- a/proto/ospf/config.Y +++ b/proto/ospf/config.Y @@ -129,7 +129,6 @@ CF_ADDTO(proto, ospf_proto '}' { ospf_proto_finish(); } ) ospf_proto_start: proto_start OSPF { this_proto = proto_config_new(&proto_ospf, sizeof(struct ospf_config), $1); - this_proto->preference = DEF_PREF_OSPF; init_list(&OSPF_CFG->area_list); init_list(&OSPF_CFG->vlink_list); OSPF_CFG->rfc1583 = DEFAULT_RFC1583; diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index ce7ad37c..73c06c27 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -1542,6 +1542,7 @@ struct protocol proto_ospf = { name: "OSPF", template: "ospf%d", attr_class: EAP_OSPF, + preference: DEF_PREF_OSPF, init: ospf_init, dump: ospf_dump, start: ospf_start, diff --git a/proto/pipe/config.Y b/proto/pipe/config.Y index 4478afe7..40637558 100644 --- a/proto/pipe/config.Y +++ b/proto/pipe/config.Y @@ -24,7 +24,6 @@ CF_ADDTO(proto, pipe_proto '}') pipe_proto_start: proto_start PIPE { this_proto = proto_config_new(&proto_pipe, sizeof(struct pipe_config), $1); - this_proto->preference = DEF_PREF_PIPE; PIPE_CFG->mode = PIPE_TRANSPARENT; } ; diff --git a/proto/pipe/pipe.c b/proto/pipe/pipe.c index 420c5a9d..fe8618b6 100644 --- a/proto/pipe/pipe.c +++ b/proto/pipe/pipe.c @@ -197,6 +197,7 @@ pipe_get_status(struct proto *P, byte *buf) struct protocol proto_pipe = { name: "Pipe", template: "pipe%d", + preference: DEF_PREF_PIPE, postconfig: pipe_postconfig, init: pipe_init, start: pipe_start, diff --git a/proto/rip/rip.c b/proto/rip/rip.c index 543aa306..f0a41347 100644 --- a/proto/rip/rip.c +++ b/proto/rip/rip.c @@ -975,7 +975,6 @@ void rip_init_config(struct rip_proto_config *c) { init_list(&c->iface_list); - c->c.preference = DEF_PREF_RIP; c->infinity = 16; c->port = 520; c->period = 30; @@ -1032,6 +1031,7 @@ struct protocol proto_rip = { name: "RIP", template: "rip%d", attr_class: EAP_RIP, + preference: DEF_PREF_RIP, get_route_info: rip_get_route_info, get_attr: rip_get_attr, diff --git a/proto/static/static.c b/proto/static/static.c index f6c2a33f..aaa9bfad 100644 --- a/proto/static/static.c +++ b/proto/static/static.c @@ -353,7 +353,6 @@ static_if_notify(struct proto *p, unsigned flags, struct iface *i) void static_init_config(struct static_config *c) { - c->c.preference = DEF_PREF_STATIC; init_list(&c->iface_routes); init_list(&c->other_routes); } @@ -523,6 +522,7 @@ static_copy_config(struct proto_config *dest, struct proto_config *src) struct protocol proto_static = { name: "Static", template: "static%d", + preference: DEF_PREF_STATIC, init: static_init, dump: static_dump, start: static_start, diff --git a/sysdep/unix/krt.Y b/sysdep/unix/krt.Y index 86081966..18e1e52d 100644 --- a/sysdep/unix/krt.Y +++ b/sysdep/unix/krt.Y @@ -31,7 +31,6 @@ kern_proto_start: proto_start KERNEL { cf_error("Kernel protocol already defined"); #endif cf_krt = this_proto = proto_config_new(&proto_unix_kernel, sizeof(struct krt_config), $1); - this_proto->preference = DEF_PREF_INHERITED; THIS_KRT->scan_time = 60; THIS_KRT->learn = THIS_KRT->persist = 0; krt_scan_construct(THIS_KRT); @@ -67,7 +66,6 @@ kif_proto_start: proto_start DEVICE { if (cf_kif) cf_error("Kernel device protocol already defined"); cf_kif = this_proto = proto_config_new(&proto_unix_iface, sizeof(struct kif_config), $1); - this_proto->preference = DEF_PREF_DIRECT; THIS_KIF->scan_time = 60; init_list(&THIS_KIF->primary); krt_if_construct(THIS_KIF); diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c index ad8ea6b6..231c5fcf 100644 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@ -243,6 +243,7 @@ kif_copy_config(struct proto_config *dest, struct proto_config *src) struct protocol proto_unix_iface = { name: "Device", template: "device%d", + preference: DEF_PREF_DIRECT, preconfig: kif_preconfig, init: kif_init, start: kif_start, @@ -968,6 +969,7 @@ struct protocol proto_unix_kernel = { name: "Kernel", template: "kernel%d", attr_class: EAP_KRT, + preference: DEF_PREF_INHERITED, preconfig: krt_preconfig, postconfig: krt_postconfig, init: krt_init,