diff options
author | Claudio Jeker <claudio@cvs.openbsd.org> | 2007-01-08 13:01:11 +0000 |
---|---|---|
committer | Claudio Jeker <claudio@cvs.openbsd.org> | 2007-01-08 13:01:11 +0000 |
commit | 8cf5e5d0dcd02c4453763f05ad9344b4a102bf01 (patch) | |
tree | 48e3ce4716baadf5f82bfbd28fcced6e1729ad5e /usr.sbin/ripd | |
parent | 57f30f1e02f248dca0c929ad89b5ee540b182aeb (diff) |
New redistribute code adapted from ospfd. It is now possible to do the same
redistribute setups as in ospfd (rtlables, per prefix, negation).
Tested, input and OK michele@
Diffstat (limited to 'usr.sbin/ripd')
-rw-r--r-- | usr.sbin/ripd/Makefile | 6 | ||||
-rw-r--r-- | usr.sbin/ripd/name2id.c | 173 | ||||
-rw-r--r-- | usr.sbin/ripd/parse.y | 159 | ||||
-rw-r--r-- | usr.sbin/ripd/printconf.c | 55 | ||||
-rw-r--r-- | usr.sbin/ripd/rde.c | 13 | ||||
-rw-r--r-- | usr.sbin/ripd/ripd.c | 76 | ||||
-rw-r--r-- | usr.sbin/ripd/ripd.h | 45 | ||||
-rw-r--r-- | usr.sbin/ripd/ripe.c | 13 |
8 files changed, 434 insertions, 106 deletions
diff --git a/usr.sbin/ripd/Makefile b/usr.sbin/ripd/Makefile index 1210b600dc7..9a7539f747a 100644 --- a/usr.sbin/ripd/Makefile +++ b/usr.sbin/ripd/Makefile @@ -1,9 +1,9 @@ -# $OpenBSD: Makefile,v 1.2 2006/11/26 11:31:13 deraadt Exp $ +# $OpenBSD: Makefile,v 1.3 2007/01/08 13:01:10 claudio Exp $ PROG= ripd SRCS= auth.c buffer.c control.c imsg.c interface.c kroute.c \ - log.c message.c neighbor.c packet.c parse.y printconf.c \ - rde.c rde_rib.c ripe.c ripd.c + log.c message.c name2id.c neighbor.c packet.c parse.y \ + printconf.c rde.c rde_rib.c ripe.c ripd.c MAN= ripd.8 ripd.conf.5 diff --git a/usr.sbin/ripd/name2id.c b/usr.sbin/ripd/name2id.c new file mode 100644 index 00000000000..f5c2387c89f --- /dev/null +++ b/usr.sbin/ripd/name2id.c @@ -0,0 +1,173 @@ +/* $OpenBSD: name2id.c,v 1.1 2007/01/08 13:01:10 claudio Exp $ */ + +/* + * Copyright (c) 2004, 2005 Henning Brauer <henning@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/types.h> +#include <sys/socket.h> + +#include <net/route.h> + +#include <errno.h> +#include <stdlib.h> +#include <string.h> + +#include "ripd.h" + +#define IDVAL_MAX 50000 + +struct n2id_label { + TAILQ_ENTRY(n2id_label) entry; + char *name; + u_int16_t id; + int ref; +}; + +TAILQ_HEAD(n2id_labels, n2id_label); + +u_int16_t _name2id(struct n2id_labels *, const char *); +const char *_id2name(struct n2id_labels *, u_int16_t); +void _unref(struct n2id_labels *, u_int16_t); +void _ref(struct n2id_labels *, u_int16_t); + +struct n2id_labels rt_labels = TAILQ_HEAD_INITIALIZER(rt_labels); + +u_int16_t +rtlabel_name2id(const char *name) +{ + return (_name2id(&rt_labels, name)); +} + +const char * +rtlabel_id2name(u_int16_t id) +{ + return (_id2name(&rt_labels, id)); +} + +void +rtlabel_unref(u_int16_t id) +{ + _unref(&rt_labels, id); +} + +/* +void +rtlabel_ref(u_int16_t id) +{ + _ref(&rt_labels, id); +} +*/ + +u_int16_t +_name2id(struct n2id_labels *head, const char *name) +{ + struct n2id_label *label, *p = NULL; + u_int16_t new_id = 1; + + if (!name[0]) { + errno = EINVAL; + return (0); + } + + TAILQ_FOREACH(label, head, entry) + if (strcmp(name, label->name) == 0) { + label->ref++; + return (label->id); + } + + /* + * to avoid fragmentation, we do a linear search from the beginning + * and take the first free slot we find. if there is none or the list + * is empty, append a new entry at the end. + */ + + if (!TAILQ_EMPTY(head)) + for (p = TAILQ_FIRST(head); p != NULL && + p->id == new_id; p = TAILQ_NEXT(p, entry)) + new_id = p->id + 1; + + if (new_id > IDVAL_MAX) { + errno = ERANGE; + return (0); + } + + if ((label = calloc(1, sizeof(struct n2id_label))) == NULL) + return (0); + if ((label->name = strdup(name)) == NULL) { + free(label); + return (0); + } + label->id = new_id; + label->ref++; + + if (p != NULL) /* insert new entry before p */ + TAILQ_INSERT_BEFORE(p, label, entry); + else /* either list empty or no free slot in between */ + TAILQ_INSERT_TAIL(head, label, entry); + + return (label->id); +} + +const char * +_id2name(struct n2id_labels *head, u_int16_t id) +{ + struct n2id_label *label; + + if (id == 0) + return (""); + + TAILQ_FOREACH(label, head, entry) + if (label->id == id) + return (label->name); + + return (""); +} + +void +_unref(struct n2id_labels *head, u_int16_t id) +{ + struct n2id_label *p, *next; + + if (id == 0) + return; + + for (p = TAILQ_FIRST(head); p != NULL; p = next) { + next = TAILQ_NEXT(p, entry); + if (id == p->id) { + if (--p->ref == 0) { + TAILQ_REMOVE(head, p, entry); + free(p->name); + free(p); + } + break; + } + } +} + +void +_ref(struct n2id_labels *head, u_int16_t id) +{ + struct n2id_label *label; + + if (id == 0) + return; + + TAILQ_FOREACH(label, head, entry) + if (label->id == id) { + ++label->ref; + break; + } +} diff --git a/usr.sbin/ripd/parse.y b/usr.sbin/ripd/parse.y index 04da8b4cf51..6c6e7618c1b 100644 --- a/usr.sbin/ripd/parse.y +++ b/usr.sbin/ripd/parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.y,v 1.4 2006/10/25 20:01:49 henning Exp $ */ +/* $OpenBSD: parse.y,v 1.5 2007/01/08 13:01:10 claudio Exp $ */ /* * Copyright (c) 2006 Michele Marchetto <mydecay@openbeer.it> @@ -50,17 +50,18 @@ char *start_state; struct iface *iface = NULL; -int yyerror(const char *, ...); -int yyparse(void); -int kw_cmp(const void *, const void *); -int lookup(char *); -int lgetc(FILE *); -int lungetc(int); -int findeol(void); -int yylex(void); -void clear_config(struct ripd_conf *); -int check_file_secrecy(int fd, const char *fname); -u_int32_t get_rtr_id(void); +int yyerror(const char *, ...); +int yyparse(void); +int kw_cmp(const void *, const void *); +int lookup(char *); +int lgetc(FILE *); +int lungetc(int); +int findeol(void); +int yylex(void); +void clear_config(struct ripd_conf *); +int check_file_secrecy(int, const char *); +u_int32_t get_rtr_id(void); +int host(const char *, struct in_addr *, struct in_addr *); static struct { char auth_key[MAX_SIMPLE_AUTH_LEN]; @@ -95,11 +96,12 @@ typedef struct { %token SPLIT_HORIZON TRIGGERED_UPDATES FIBUPDATE REDISTRIBUTE %token AUTHKEY AUTHTYPE AUTHMD AUTHMDKEYID -%token INTERFACE +%token INTERFACE RTLABEL %token COST PASSIVE +%token YES NO %token ERROR %token <v.string> STRING -%type <v.number> number yesno +%type <v.number> number yesno no %type <v.string> string %% @@ -139,20 +141,13 @@ string : string STRING { | STRING ; -yesno : STRING { - if (!strcmp($1, "yes")) - $$ = 1; - else if (!strcmp($1, "no")) - $$ = 0; - else { - free($1); - yyerror("recognized values are yes or no"); - YYERROR; - } - free($1); - } +yesno : YES { $$ = 1; } + | NO { $$ = 0; } ; +no : /* empty */ { $$ = 0; } + | NO { $$ = 1; } + varset : STRING '=' string { if (conf->opts & RIPD_OPT_VERBOSE) printf("%s = \"%s\"\n", $1, $3); @@ -192,24 +187,54 @@ conf_main : SPLIT_HORIZON STRING { else conf->flags &= ~RIPD_FLAG_NO_FIB_UPDATE; } - | REDISTRIBUTE STRING { - if (!strcmp($2, "static")) - conf->redistribute_flags |= - REDISTRIBUTE_STATIC; - else if (!strcmp($2, "connected")) - conf->redistribute_flags |= - REDISTRIBUTE_CONNECTED; - else if (!strcmp($2, "default")) - conf->redistribute_flags |= - REDISTRIBUTE_DEFAULT; - else if (!strcmp($2, "none")) - conf->redistribute_flags = 0; - else { - yyerror("unknown redistribute type"); - free($2); - YYERROR; + | no REDISTRIBUTE STRING { + struct redistribute *r; + + if (!strcmp($3, "default")) { + if (!$1) + conf->redistribute |= + REDISTRIBUTE_DEFAULT; + else + conf->redistribute &= + ~REDISTRIBUTE_DEFAULT; + } else { + if ((r = calloc(1, sizeof(*r))) == NULL) + fatal(NULL); + if (!strcmp($3, "static")) + r->type = REDIST_STATIC; + else if (!strcmp($3, "connected")) + r->type = REDIST_CONNECTED; + else if (host($3, &r->addr, &r->mask)) + r->type = REDIST_ADDR; + else { + yyerror("unknown redistribute type"); + free($3); + free(r); + YYERROR; + } + + if ($1) + r->type |= REDIST_NO; + + SIMPLEQ_INSERT_TAIL(&conf->redist_list, r, + entry); } - free($2); + conf->redistribute |= REDISTRIBUTE_ON; + free($3); + } + | no REDISTRIBUTE RTLABEL STRING { + struct redistribute *r; + + if ((r = calloc(1, sizeof(*r))) == NULL) + fatal(NULL); + r->type = REDIST_LABEL; + r->label = rtlabel_name2id($4); + if ($1) + r->type |= REDIST_NO; + free($4); + + SIMPLEQ_INSERT_TAIL(&conf->redist_list, r, entry); + conf->redistribute |= REDISTRIBUTE_ON; } ; @@ -365,17 +390,20 @@ lookup(char *s) { /* this has to be sorted always */ static const struct keywords keywords[] = { - {"auth-key", AUTHKEY}, - {"auth-md", AUTHMD}, - {"auth-md-keyid", AUTHMDKEYID}, - {"auth-type", AUTHTYPE}, - {"cost", COST}, - {"fib-update", FIBUPDATE}, - {"interface", INTERFACE}, - {"passive", PASSIVE}, - {"redistribute", REDISTRIBUTE}, - {"split-horizon", SPLIT_HORIZON}, - {"triggered-updates", TRIGGERED_UPDATES} + {"auth-key", AUTHKEY}, + {"auth-md", AUTHMD}, + {"auth-md-keyid", AUTHMDKEYID}, + {"auth-type", AUTHTYPE}, + {"cost", COST}, + {"fib-update", FIBUPDATE}, + {"interface", INTERFACE}, + {"no", NO}, + {"passive", PASSIVE}, + {"redistribute", REDISTRIBUTE}, + {"rtlabel", RTLABEL}, + {"split-horizon", SPLIT_HORIZON}, + {"triggered-updates", TRIGGERED_UPDATES}, + {"yes", YES} }; const struct keywords *p; @@ -597,7 +625,7 @@ parse_config(char *filename, int opts) infile = filename; conf->opts = opts; - conf->redistribute_flags = 0; + SIMPLEQ_INIT(&conf->redist_list); if (!(conf->opts & RIPD_OPT_NOACTION)) if (check_file_secrecy(fileno(fin), filename)) { @@ -740,3 +768,24 @@ clear_config(struct ripd_conf *xconf) free(xconf); } + +int +host(const char *s, struct in_addr *addr, struct in_addr *mask) +{ + struct in_addr ina; + int bits = 32; + + bzero(&ina, sizeof(struct in_addr)); + if (strrchr(s, '/') != NULL) { + if ((bits = inet_net_pton(AF_INET, s, &ina, sizeof(ina))) == -1) + return (0); + } else { + if (inet_pton(AF_INET, s, &ina) != 1) + return (0); + } + + addr->s_addr = ina.s_addr; + mask->s_addr = prefixlen2mask(bits); + + return (1); +} diff --git a/usr.sbin/ripd/printconf.c b/usr.sbin/ripd/printconf.c index 6e8da516f2b..3eac0201c4c 100644 --- a/usr.sbin/ripd/printconf.c +++ b/usr.sbin/ripd/printconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: printconf.c,v 1.2 2006/11/09 04:06:09 joel Exp $ */ +/* $OpenBSD: printconf.c,v 1.3 2007/01/08 13:01:10 claudio Exp $ */ /* * Copyright (c) 2004, 2005, 2006 Esben Norby <norby@openbsd.org> @@ -28,8 +28,10 @@ #include "ripd.h" #include "ripe.h" -void print_mainconf(struct ripd_conf *); -void print_iface(struct iface *); +void print_mainconf(struct ripd_conf *); +const char *print_no(u_int16_t); +void print_redistribute(struct ripd_conf *); +void print_iface(struct iface *); void print_mainconf(struct ripd_conf *conf) @@ -39,14 +41,7 @@ print_mainconf(struct ripd_conf *conf) else printf("fib-update yes\n"); - if (conf->redistribute_flags & REDISTRIBUTE_STATIC) - printf("redistribute static\n"); - else if (conf->redistribute_flags & REDISTRIBUTE_CONNECTED) - printf("redistribute connected\n"); - else if (conf->redistribute_flags & REDISTRIBUTE_DEFAULT) - printf("redistribute default\n"); - else - printf("redistribute none\n"); + print_redistribute(conf); if (conf->options & OPT_SPLIT_HORIZON) printf("split-horizon default\n"); @@ -61,6 +56,44 @@ print_mainconf(struct ripd_conf *conf) printf("triggered-updates no\n"); } +const char * +print_no(u_int16_t type) +{ + if (type & REDIST_NO) + return ("no "); + else + return (""); +} + +void +print_redistribute(struct ripd_conf *conf) +{ + struct redistribute *r; + + if (conf->redistribute & REDISTRIBUTE_DEFAULT) + printf("redistribute default\n"); + + SIMPLEQ_FOREACH(r, &conf->redist_list, entry) { + switch (r->type & ~REDIST_NO) { + case REDIST_STATIC: + printf("%sredistribute static\n", print_no(r->type)); + break; + case REDIST_CONNECTED: + printf("%sredistribute connected\n", print_no(r->type)); + break; + case REDIST_LABEL: + printf("%sredistribute rtlabel %s\n", + print_no(r->type), rtlabel_id2name(r->label)); + break; + case REDIST_ADDR: + printf("%ssredistribute %s/%d\n", + print_no(r->type), inet_ntoa(r->addr), + mask2prefixlen(r->mask.s_addr)); + break; + } + } +} + void print_iface(struct iface *iface) { diff --git a/usr.sbin/ripd/rde.c b/usr.sbin/ripd/rde.c index 82269981e73..9f75bba78a6 100644 --- a/usr.sbin/ripd/rde.c +++ b/usr.sbin/ripd/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.2 2006/10/24 16:37:48 david Exp $ */ +/* $OpenBSD: rde.c,v 1.3 2007/01/08 13:01:10 claudio Exp $ */ /* * Copyright (c) 2006 Michele Marchetto <mydecay@openbeer.it> @@ -75,8 +75,9 @@ pid_t rde(struct ripd_conf *xconf, int pipe_parent2rde[2], int pipe_ripe2rde[2], int pipe_parent2ripe[2]) { - struct passwd *pw; struct event ev_sigint, ev_sigterm; + struct passwd *pw; + struct redistribute *r; pid_t pid; switch (pid = fork()) { @@ -137,8 +138,14 @@ rde(struct ripd_conf *xconf, int pipe_parent2rde[2], int pipe_ripe2rde[2], event_set(&ibuf_main->ev, ibuf_main->fd, ibuf_main->events, ibuf_main->handler, ibuf_main); event_add(&ibuf_main->ev, NULL); - rt_init(); + + /* remove unneeded config stuff */ + while ((r = SIMPLEQ_FIRST(&rdeconf->redist_list)) != NULL) { + SIMPLEQ_REMOVE_HEAD(&rdeconf->redist_list, entry); + free(r); + } + event_dispatch(); rde_shutdown(); diff --git a/usr.sbin/ripd/ripd.c b/usr.sbin/ripd/ripd.c index f0fc22e2678..cd0fb308570 100644 --- a/usr.sbin/ripd/ripd.c +++ b/usr.sbin/ripd/ripd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ripd.c,v 1.1 2006/10/18 16:11:58 norby Exp $ */ +/* $OpenBSD: ripd.c,v 1.2 2007/01/08 13:01:10 claudio Exp $ */ /* * Copyright (c) 2006 Michele Marchetto <mydecay@openbeer.it> @@ -55,6 +55,7 @@ void ripd_shutdown(void); void main_dispatch_ripe(int, short, void *); void main_dispatch_rde(int, short, void *); int check_file_secrecy(int, const char *); +void ripd_redistribute_default(int); int pipe_parent2ripe[2]; int pipe_parent2rde[2]; @@ -251,6 +252,9 @@ main(int argc, char *argv[]) if (kr_init(!(conf->flags & RIPD_FLAG_NO_FIB_UPDATE)) == -1) fatalx("kr_init failed"); + /* redistribute default */ + ripd_redistribute_default(IMSG_NETWORK_ADD); + event_dispatch(); ripd_shutdown(); @@ -468,29 +472,63 @@ check_file_secrecy(int fd, const char *fname) int rip_redistribute(struct kroute *kr) { + struct redistribute *r; + if (kr->flags & F_RIPD_INSERTED) return (1); - /* XXX this is funky, it is not possible to distribute static and - * connected. OSPFD has a much better way to do this including rtlabel - * support - */ - switch (conf->redistribute_flags) { - case REDISTRIBUTE_NONE: + /* only allow 0.0.0.0/0 via REDISTRIBUTE_DEFAULT */ + if (kr->prefix.s_addr == INADDR_ANY && kr->netmask.s_addr == INADDR_ANY) return (0); - case REDISTRIBUTE_STATIC: - return (kr->flags & F_KERNEL ? 1 : 0); - case REDISTRIBUTE_CONNECTED: - return (kr->flags & F_CONNECTED ? 1 : 0); - case REDISTRIBUTE_DEFAULT: - if (kr->prefix.s_addr == INADDR_ANY && - kr->netmask.s_addr == INADDR_ANY) - return (1); - else - return (0); - default: - fatalx("unknown redistribute type"); + + SIMPLEQ_FOREACH(r, &conf->redist_list, entry) { + switch (r->type & ~REDIST_NO) { + case REDIST_LABEL: + if (kr->rtlabel == r->label) + return (r->type & REDIST_NO ? 0 : 1); + break; + case REDIST_STATIC: + /* + * Dynamic routes are not redistributable. Placed here + * so that link local addresses can be redistributed + * via a rtlabel. + */ + if (kr->flags & F_DYNAMIC) + continue; + if (kr->flags & F_STATIC) + return (r->type & REDIST_NO ? 0 : 1); + break; + case REDIST_CONNECTED: + if (kr->flags & F_DYNAMIC) + continue; + if (kr->flags & F_CONNECTED) + return (r->type & REDIST_NO ? 0 : 1); + break; + case REDIST_ADDR: + if (kr->flags & F_DYNAMIC) + continue; + if ((kr->prefix.s_addr & r->mask.s_addr) == + (r->addr.s_addr & r->mask.s_addr) && + (kr->netmask.s_addr & r->mask.s_addr) == + r->mask.s_addr) + return (r->type & REDIST_NO? 0 : 1); + break; + } } + + return (0); +} + +void +ripd_redistribute_default(int type) +{ + struct kroute kr; + + if (!(conf->redistribute & REDISTRIBUTE_DEFAULT)) + return; + + bzero(&kr, sizeof(kr)); + main_imsg_compose_rde(type, 0, &kr, sizeof(struct kroute)); } /* this needs to be added here so that ripctl can be used without libevent */ diff --git a/usr.sbin/ripd/ripd.h b/usr.sbin/ripd/ripd.h index ff10de1516c..b4fb382efef 100644 --- a/usr.sbin/ripd/ripd.h +++ b/usr.sbin/ripd/ripd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ripd.h,v 1.4 2006/11/15 20:21:46 deraadt Exp $ */ +/* $OpenBSD: ripd.h,v 1.5 2007/01/08 13:01:10 claudio Exp $ */ /* * Copyright (c) 2004 Esben Norby <norby@openbsd.org> @@ -57,10 +57,8 @@ #define F_OSPFD_INSERTED 0x0080 #define F_REDISTRIBUTED 0x0100 -#define REDISTRIBUTE_NONE 0x0 -#define REDISTRIBUTE_STATIC 0x01 -#define REDISTRIBUTE_CONNECTED 0x02 -#define REDISTRIBUTE_DEFAULT 0x04 +#define REDISTRIBUTE_ON 0x01 +#define REDISTRIBUTE_DEFAULT 0x02 #define OPT_SPLIT_HORIZON 0x01 #define OPT_SPLIT_POISONED 0x02 @@ -252,28 +250,46 @@ enum { PROC_RDE_ENGINE } ripd_process; +#define REDIST_CONNECTED 0x01 +#define REDIST_STATIC 0x02 +#define REDIST_LABEL 0x04 +#define REDIST_ADDR 0x08 +#define REDIST_NO 0x10 + +struct redistribute { + SIMPLEQ_ENTRY(redistribute) entry; + struct in_addr addr; + struct in_addr mask; + u_int32_t metric; + u_int16_t label; + u_int16_t type; +}; + struct ripd_conf { struct event ev; struct event report_timer; LIST_HEAD(, iface) iface_list; + SIMPLEQ_HEAD(, redistribute) redist_list; + u_int32_t opts; #define RIPD_OPT_VERBOSE 0x00000001 #define RIPD_OPT_VERBOSE2 0x00000002 #define RIPD_OPT_NOACTION 0x00000004 int flags; - int redistribute_flags; int options; int rip_socket; + int redistribute; }; /* kroute */ struct kroute { - struct in_addr prefix; - struct in_addr netmask; - struct in_addr nexthop; - u_int8_t metric; - u_int16_t flags; - u_short ifindex; + struct in_addr prefix; + struct in_addr netmask; + struct in_addr nexthop; + u_int16_t flags; + u_int16_t rtlabel; + u_short ifindex; + u_int8_t metric; }; struct kif { @@ -390,4 +406,9 @@ const char *nbr_state_name(int); /* interface.c */ struct iface *if_find_index(u_short); +/* name2id.c */ +u_int16_t rtlabel_name2id(const char *); +const char *rtlabel_id2name(u_int16_t); +void rtlabel_unref(u_int16_t); + #endif /* _RIPD_H_ */ diff --git a/usr.sbin/ripd/ripe.c b/usr.sbin/ripd/ripe.c index 4abbb4040c2..559a32fd557 100644 --- a/usr.sbin/ripd/ripe.c +++ b/usr.sbin/ripd/ripe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ripe.c,v 1.4 2006/11/28 19:21:16 reyk Exp $ */ +/* $OpenBSD: ripe.c,v 1.5 2007/01/08 13:01:10 claudio Exp $ */ /* * Copyright (c) 2006 Michele Marchetto <mydecay@openbeer.it> @@ -69,10 +69,11 @@ pid_t ripe(struct ripd_conf *xconf, int pipe_parent2ripe[2], int pipe_ripe2rde[2], int pipe_parent2rde[2]) { - struct iface *iface = NULL; + struct event ev_sigint, ev_sigterm; struct sockaddr_in addr; + struct iface *iface = NULL; struct passwd *pw; - struct event ev_sigint, ev_sigterm; + struct redistribute *r; pid_t pid; switch (pid = fork()) { @@ -170,6 +171,12 @@ ripe(struct ripd_conf *xconf, int pipe_parent2ripe[2], int pipe_ripe2rde[2], recv_packet, oeconf); event_add(&oeconf->ev, NULL); + /* remove unneeded config stuff */ + while ((r = SIMPLEQ_FIRST(&oeconf->redist_list)) != NULL) { + SIMPLEQ_REMOVE_HEAD(&oeconf->redist_list, entry); + free(r); + } + /* listen on ripd control socket */ TAILQ_INIT(&ctl_conns); control_listen(); |