Separated `official protocol names' used in status dumps from name templates

used for automatic generation of instance names.

	protocol->name is the official name
	protocol->template is the name template (usually "name%d"),
		should be all lowercase.

Updated all protocols to define the templates, checked that their configuration
grammar includes proto_name which generates the name and interns it in the
symbol table.
This commit is contained in:
Martin Mares 2000-01-17 11:52:50 +00:00
parent f7fcb75252
commit d272fe22dd
13 changed files with 35 additions and 15 deletions

3
TODO
View file

@ -26,9 +26,7 @@ Core
- config: executable config files - config: executable config files
- config: when parsing prefix, check zero bits - config: when parsing prefix, check zero bits
- config: useless rules when protocols disabled - config: useless rules when protocols disabled
- config: remove protocol startup priority hacks?
- config: better datetime format - config: better datetime format
- config: avoid upper case in default protocol names
- krt: rescan interfaces when route addition fails? - krt: rescan interfaces when route addition fails?
- krt: does PERSIST mode have any sense if kernel syncer is shut down as last? - krt: does PERSIST mode have any sense if kernel syncer is shut down as last?
@ -79,6 +77,7 @@ Cleanup
- does everybody test return value of sk_open? - does everybody test return value of sk_open?
- add references to RFC's we did follow - add references to RFC's we did follow
- protocols: implement CLI hooks - protocols: implement CLI hooks
- protocols: implement reconfigure hook
- protocols: use locking - protocols: use locking
Various ideas Various ideas

View file

@ -1,7 +1,7 @@
/* /*
* BIRD -- Configuration Lexer * BIRD -- Configuration Lexer
* *
* (c) 1998--1999 Martin Mares <mj@ucw.cz> * (c) 1998--2000 Martin Mares <mj@ucw.cz>
* *
* Can be freely distributed and used under the terms of the GNU GPL. * Can be freely distributed and used under the terms of the GNU GPL.
*/ */
@ -19,6 +19,7 @@
#include "filter/filter.h" #include "filter/filter.h"
#include "conf/conf.h" #include "conf/conf.h"
#include "conf/cf-parse.tab.h" #include "conf/cf-parse.tab.h"
#include "lib/string.h"
static struct keyword { static struct keyword {
byte *name; byte *name;
@ -231,19 +232,24 @@ cf_find_symbol(byte *c)
} }
struct symbol * struct symbol *
cf_default_name(char *prefix, int *counter) cf_default_name(char *template, int *counter)
{ {
char buf[32]; char buf[32];
struct symbol *s; struct symbol *s;
char *perc = strchr(template, '%');
do for(;;)
{ {
sprintf(buf, "%s%d", prefix, ++(*counter)); bsprintf(buf, template, ++(*counter));
s = cf_find_sym(buf, cf_hash(buf)); s = cf_find_sym(buf, cf_hash(buf));
if (!s) cf_error("Unable to generate default name"); if (!s)
break;
if (s->class == SYM_VOID)
return s;
if (!perc)
break;
} }
while (s->class != SYM_VOID); cf_error("Unable to generate default name");
return s;
} }
void void

View file

@ -90,7 +90,7 @@ extern int conf_lino;
int cf_lex(void); int cf_lex(void);
void cf_lex_init(int is_cli); void cf_lex_init(int is_cli);
struct symbol *cf_find_symbol(byte *c); struct symbol *cf_find_symbol(byte *c);
struct symbol *cf_default_name(char *prefix, int *counter); struct symbol *cf_default_name(char *template, int *counter);
void cf_define_symbol(struct symbol *symbol, int type, void *def); void cf_define_symbol(struct symbol *symbol, int type, void *def);
void cf_push_scope(struct symbol *); void cf_push_scope(struct symbol *);
void cf_pop_scope(void); void cf_pop_scope(void);

View file

@ -76,7 +76,7 @@ proto_start: PROTOCOL
proto_name: proto_name:
/* EMPTY */ { /* EMPTY */ {
struct symbol *s = cf_default_name(this_proto->protocol->name, &this_proto->protocol->name_counter); struct symbol *s = cf_default_name(this_proto->protocol->template, &this_proto->protocol->name_counter);
s->class = SYM_PROTO; s->class = SYM_PROTO;
s->def = this_proto; s->def = this_proto;
this_proto->name = s->name; this_proto->name = s->name;

View file

@ -33,6 +33,7 @@ struct symbol;
struct protocol { struct protocol {
node n; node n;
char *name; char *name;
char *template; /* Template for automatic generation of names */
unsigned debug; /* Default debugging flags */ unsigned debug; /* Default debugging flags */
int priority; /* Protocol priority (usually 0) */ int priority; /* Protocol priority (usually 0) */
int name_counter; /* Counter for automatic name generation */ int name_counter; /* Counter for automatic name generation */

View file

@ -88,6 +88,7 @@ dev_reconfigure(struct proto *p, struct proto_config *new)
struct protocol proto_device = { struct protocol proto_device = {
name: "Direct", name: "Direct",
template: "direct%d",
priority: 90, priority: 90,
init: dev_init, init: dev_init,
reconfigure: dev_reconfigure reconfigure: dev_reconfigure

View file

@ -90,6 +90,7 @@ ospf_postconfig(struct proto_config *c)
struct protocol proto_ospf = { struct protocol proto_ospf = {
name: "OSPF", name: "OSPF",
template: "ospf%d",
init: ospf_init, init: ospf_init,
dump: ospf_dump, dump: ospf_dump,
start: ospf_start, start: ospf_start,

View file

@ -163,6 +163,7 @@ pipe_reconfigure(struct proto *p, struct proto_config *new)
struct protocol proto_pipe = { struct protocol proto_pipe = {
name: "Pipe", name: "Pipe",
template: "pipe%d",
postconfig: pipe_postconfig, postconfig: pipe_postconfig,
init: pipe_init, init: pipe_init,
start: pipe_start, start: pipe_start,

View file

@ -789,6 +789,7 @@ rip_postconfig(struct proto_config *c)
struct protocol proto_rip = { struct protocol proto_rip = {
name: "RIP", name: "RIP",
template: "rip%d",
preconfig: rip_preconfig, preconfig: rip_preconfig,
postconfig: rip_postconfig, postconfig: rip_postconfig,
get_route_info: rip_get_route_info, get_route_info: rip_get_route_info,

View file

@ -1,7 +1,7 @@
/* /*
* BIRD -- Static Route Generator * BIRD -- Static Route Generator
* *
* (c) 1998--1999 Martin Mares <mj@ucw.cz> * (c) 1998--2000 Martin Mares <mj@ucw.cz>
* *
* Can be freely distributed and used under the terms of the GNU GPL. * Can be freely distributed and used under the terms of the GNU GPL.
*/ */
@ -175,11 +175,19 @@ static_init(struct proto_config *c)
return p; return p;
} }
static int
static_reconfigure(struct proto *p, struct proto_config *new)
{
return 0;
}
struct protocol proto_static = { struct protocol proto_static = {
name: "Static", name: "Static",
template: "static%d",
init: static_init, init: static_init,
dump: static_dump, dump: static_dump,
start: static_start, start: static_start,
reconfigure: static_reconfigure,
}; };
static void static void

View file

@ -1,7 +1,7 @@
/* /*
* BIRD -- Static Route Generator * BIRD -- Static Route Generator
* *
* (c) 1998 Martin Mares <mj@ucw.cz> * (c) 1998--2000 Martin Mares <mj@ucw.cz>
* *
* Can be freely distributed and used under the terms of the GNU GPL. * Can be freely distributed and used under the terms of the GNU GPL.
*/ */

View file

@ -1,7 +1,7 @@
/* /*
* BIRD -- UNIX Kernel Syncer Configuration * BIRD -- UNIX Kernel Syncer Configuration
* *
* (c) 1998--1999 Martin Mares <mj@ucw.cz> * (c) 1998--2000 Martin Mares <mj@ucw.cz>
* *
* Can be freely distributed and used under the terms of the GNU GPL. * Can be freely distributed and used under the terms of the GNU GPL.
*/ */
@ -70,7 +70,7 @@ kif_proto_start: proto_start DEVICE {
} }
; ;
CF_ADDTO(kif_proto, kif_proto_start '{') CF_ADDTO(kif_proto, kif_proto_start proto_name '{')
CF_ADDTO(kif_proto, kif_proto proto_item ';') CF_ADDTO(kif_proto, kif_proto proto_item ';')
CF_ADDTO(kif_proto, kif_proto kif_item ';') CF_ADDTO(kif_proto, kif_proto kif_item ';')

View file

@ -160,6 +160,7 @@ kif_reconfigure(struct proto *p, struct proto_config *new)
struct protocol proto_unix_iface = { struct protocol proto_unix_iface = {
name: "Device", name: "Device",
template: "device%d",
priority: 100, priority: 100,
preconfig: kif_preconfig, preconfig: kif_preconfig,
init: kif_init, init: kif_init,
@ -786,6 +787,7 @@ krt_init(struct proto_config *c)
struct protocol proto_unix_kernel = { struct protocol proto_unix_kernel = {
name: "Kernel", name: "Kernel",
template: "kernel%d",
priority: 80, priority: 80,
preconfig: krt_preconfig, preconfig: krt_preconfig,
postconfig: krt_postconfig, postconfig: krt_postconfig,