Store protocol config size inside protocol structure

Make proto_config_new() use this info instead of supplied size.

Thanks to Alexander V. Chernikov for the patch.
This commit is contained in:
Ondrej Zajicek 2015-02-21 21:08:23 +01:00
parent 374917adcc
commit 2bbc308321
19 changed files with 38 additions and 29 deletions

View file

@ -307,7 +307,7 @@ tos:
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 = proto_config_new(&proto_device, $1);
init_list(&DIRECT_CFG->iface_list);
}
;

View file

@ -245,7 +245,6 @@ proto_free_ahooks(struct proto *p)
/**
* proto_config_new - create a new protocol configuration
* @pr: protocol the configuration will belong to
* @size: size of the structure including generic data
* @class: SYM_PROTO or SYM_TEMPLATE
*
* Whenever the configuration file says that a new instance
@ -262,9 +261,9 @@ proto_free_ahooks(struct proto *p)
* initialized during protos_commit()).
*/
void *
proto_config_new(struct protocol *pr, unsigned size, int class)
proto_config_new(struct protocol *pr, int class)
{
struct proto_config *c = cfg_allocz(size);
struct proto_config *c = cfg_allocz(pr->config_size);
if (class == SYM_PROTO)
add_tail(&new_config->protos, &c->n);

View file

@ -40,7 +40,8 @@ struct protocol {
int name_counter; /* Counter for automatic name generation */
int attr_class; /* Attribute class known to this protocol */
int multitable; /* Protocol handles all announce hooks itself */
unsigned preference; /* Default protocol preference */
uint preference; /* Default protocol preference */
uint config_size; /* Size of protocol config */
void (*preconfig)(struct protocol *, struct config *); /* Just before configuring */
void (*postconfig)(struct proto_config *); /* After configuring each instance */
@ -239,7 +240,7 @@ struct proto_spec {
void *proto_new(struct proto_config *, unsigned size);
void *proto_config_new(struct protocol *, unsigned size, int class);
void *proto_config_new(struct protocol *, int class);
void proto_copy_config(struct proto_config *dest, struct proto_config *src);
void proto_request_feeding(struct proto *p);

View file

@ -115,6 +115,7 @@ struct protocol proto_device = {
.name = "Direct",
.template = "direct%d",
.preference = DEF_PREF_DIRECT,
.config_size = sizeof(struct rt_dev_config),
.init = dev_init,
.reconfigure = dev_reconfigure,
.copy_config = dev_copy_config

View file

@ -1112,6 +1112,7 @@ bfd_show_sessions(struct proto *P)
struct protocol proto_bfd = {
.name = "BFD",
.template = "bfd%d",
.config_size = sizeof(struct bfd_config),
.init = bfd_init,
.start = bfd_start,
.shutdown = bfd_shutdown,

View file

@ -34,7 +34,7 @@ CF_ADDTO(proto, bfd_proto)
bfd_proto_start: proto_start BFD
{
this_proto = proto_config_new(&proto_bfd, sizeof(struct bfd_config), $1);
this_proto = proto_config_new(&proto_bfd, $1);
init_list(&BFD_CFG->patt_list);
init_list(&BFD_CFG->neigh_list);

View file

@ -1455,6 +1455,7 @@ struct protocol proto_bgp = {
.template = "bgp%d",
.attr_class = EAP_BGP,
.preference = DEF_PREF_BGP,
.config_size = sizeof(struct bgp_config),
.init = bgp_init,
.start = bgp_start,
.shutdown = bgp_shutdown,

View file

@ -34,7 +34,7 @@ CF_GRAMMAR
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 = proto_config_new(&proto_bgp, $1);
BGP_CFG->multihop = -1; /* undefined */
BGP_CFG->hold_time = 240;
BGP_CFG->connect_retry_time = 120;

View file

@ -141,7 +141,7 @@ CF_GRAMMAR
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 = proto_config_new(&proto_ospf, $1);
init_list(&OSPF_CFG->area_list);
init_list(&OSPF_CFG->vlink_list);
OSPF_CFG->tick = OSPF_DEFAULT_TICK;

View file

@ -1457,6 +1457,7 @@ struct protocol proto_ospf = {
.template = "ospf%d",
.attr_class = EAP_OSPF,
.preference = DEF_PREF_OSPF,
.config_size = sizeof(struct ospf_config),
.init = ospf_init,
.dump = ospf_dump,
.start = ospf_start,

View file

@ -23,7 +23,7 @@ CF_GRAMMAR
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 = proto_config_new(&proto_pipe, $1);
PIPE_CFG->mode = PIPE_TRANSPARENT;
}
;

View file

@ -340,6 +340,7 @@ struct protocol proto_pipe = {
.template = "pipe%d",
.multitable = 1,
.preference = DEF_PREF_PIPE,
.config_size = sizeof(struct pipe_config),
.postconfig = pipe_postconfig,
.init = pipe_init,
.start = pipe_start,

View file

@ -40,7 +40,7 @@ CF_ADDTO(proto, radv_proto)
radv_proto_start: proto_start RADV
{
this_proto = proto_config_new(&proto_radv, sizeof(struct radv_config), $1);
this_proto = proto_config_new(&proto_radv, $1);
init_list(&RADV_CFG->patt_list);
init_list(&RADV_CFG->pref_list);
init_list(&RADV_CFG->rdnss_list);

View file

@ -426,6 +426,7 @@ radv_get_status(struct proto *p, byte *buf)
struct protocol proto_radv = {
.name = "RAdv",
.template = "radv%d",
.config_size = sizeof(struct radv_config),
.init = radv_init,
.start = radv_start,
.shutdown = radv_shutdown,

View file

@ -43,7 +43,7 @@ CF_GRAMMAR
CF_ADDTO(proto, rip_cfg '}' { RIP_CFG->passwords = get_passwords(); } )
rip_cfg_start: proto_start RIP {
this_proto = proto_config_new(&proto_rip, sizeof(struct rip_proto_config), $1);
this_proto = proto_config_new(&proto_rip, $1);
rip_init_config(RIP_CFG);
}
;

View file

@ -1050,12 +1050,12 @@ struct protocol proto_rip = {
.template = "rip%d",
.attr_class = EAP_RIP,
.preference = DEF_PREF_RIP,
.get_route_info = rip_get_route_info,
.get_attr = rip_get_attr,
.config_size = sizeof(struct rip_proto_config),
.init = rip_init,
.dump = rip_dump,
.start = rip_start,
.reconfigure = rip_reconfigure,
.copy_config = rip_copy_config
.copy_config = rip_copy_config,
.get_route_info = rip_get_route_info,
.get_attr = rip_get_attr
};

View file

@ -26,7 +26,7 @@ CF_GRAMMAR
CF_ADDTO(proto, static_proto '}')
static_proto_start: proto_start STATIC {
this_proto = proto_config_new(&proto_static, sizeof(struct static_config), $1);
this_proto = proto_config_new(&proto_static, $1);
static_init_config((struct static_config *) this_proto);
}
;

View file

@ -531,6 +531,7 @@ struct protocol proto_static = {
.name = "Static",
.template = "static%d",
.preference = DEF_PREF_STATIC,
.config_size = sizeof(struct static_config),
.init = static_init,
.dump = static_dump,
.start = static_start,

View file

@ -251,7 +251,7 @@ kif_init_config(int class)
if (kif_cf)
cf_error("Kernel device protocol already defined");
kif_cf = (struct kif_config *) proto_config_new(&proto_unix_iface, sizeof(struct kif_config), class);
kif_cf = (struct kif_config *) proto_config_new(&proto_unix_iface, class);
kif_cf->scan_time = 60;
init_list(&kif_cf->primary);
@ -280,6 +280,7 @@ struct protocol proto_unix_iface = {
.name = "Device",
.template = "device%d",
.preference = DEF_PREF_DIRECT,
.config_size = sizeof(struct kif_config),
.preconfig = kif_preconfig,
.init = kif_init,
.start = kif_start,
@ -1150,7 +1151,7 @@ krt_init_config(int class)
cf_error("Kernel protocol already defined");
#endif
krt_cf = (struct krt_config *) proto_config_new(&proto_unix_kernel, sizeof(struct krt_config), class);
krt_cf = (struct krt_config *) proto_config_new(&proto_unix_kernel, class);
krt_cf->scan_time = 60;
krt_sys_init_config(krt_cf);
@ -1202,6 +1203,7 @@ struct protocol proto_unix_kernel = {
.template = "kernel%d",
.attr_class = EAP_KRT,
.preference = DEF_PREF_INHERITED,
.config_size = sizeof(struct krt_config),
.preconfig = krt_preconfig,
.postconfig = krt_postconfig,
.init = krt_init,