summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorclaudio <claudio@openbsd.org>2015-03-14 03:52:42 +0000
committerclaudio <claudio@openbsd.org>2015-03-14 03:52:42 +0000
commit04c6d98ad7f285f9dd3dd20a0fbf4d8ae2504f66 (patch)
tree01d2899334e6b96cfaeafd08c40f6d14aca0a98a
parentRemove some includes include-what-you-use claims don't (diff)
downloadwireguard-openbsd-04c6d98ad7f285f9dd3dd20a0fbf4d8ae2504f66.tar.xz
wireguard-openbsd-04c6d98ad7f285f9dd3dd20a0fbf4d8ae2504f66.zip
rename rde_free_filter() to filterlist_free() and start using it outside
of the RDE to free the filterlists. Also refactor common code to merge filterlists into its own function. Makes the code look nicer.
-rw-r--r--usr.sbin/bgpd/bgpd.h5
-rw-r--r--usr.sbin/bgpd/parse.y55
-rw-r--r--usr.sbin/bgpd/rde.c10
-rw-r--r--usr.sbin/bgpd/rde.h3
-rw-r--r--usr.sbin/bgpd/rde_filter.c4
-rw-r--r--usr.sbin/bgpd/rde_rib.c6
6 files changed, 36 insertions, 47 deletions
diff --git a/usr.sbin/bgpd/bgpd.h b/usr.sbin/bgpd/bgpd.h
index fb5ab850071..48672e68102 100644
--- a/usr.sbin/bgpd/bgpd.h
+++ b/usr.sbin/bgpd/bgpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: bgpd.h,v 1.283 2015/03/14 02:43:02 claudio Exp $ */
+/* $OpenBSD: bgpd.h,v 1.284 2015/03/14 03:52:42 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -930,7 +930,8 @@ void control_cleanup(const char *);
int control_imsg_relay(struct imsg *);
/* config.c */
-int host(const char *, struct bgpd_addr *, u_int8_t *);
+void filterlist_free(struct filter_head *);
+int host(const char *, struct bgpd_addr *, u_int8_t *);
/* kroute.c */
int kr_init(void);
diff --git a/usr.sbin/bgpd/parse.y b/usr.sbin/bgpd/parse.y
index ac954c8285e..971fcddd6ec 100644
--- a/usr.sbin/bgpd/parse.y
+++ b/usr.sbin/bgpd/parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.277 2015/03/14 02:43:02 claudio Exp $ */
+/* $OpenBSD: parse.y,v 1.278 2015/03/14 03:52:42 claudio Exp $ */
/*
* Copyright (c) 2002, 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -135,6 +135,7 @@ int neighbor_consistent(struct peer *);
int merge_filterset(struct filter_set_head *, struct filter_set *);
void copy_filterset(struct filter_set_head *,
struct filter_set_head *);
+void merge_filter_lists(struct filter_head *, struct filter_head *);
struct filter_rule *get_rule(enum action_types);
int getcommunity(char *);
@@ -2574,7 +2575,6 @@ parse_config(char *filename, struct bgpd_config *xconf,
struct peer *p, *pnext;
struct listen_addr *la;
struct network *n;
- struct filter_rule *r;
struct rde_rib *rr;
struct rdomain *rd;
int errors = 0;
@@ -2663,23 +2663,10 @@ parse_config(char *filename, struct bgpd_config *xconf,
free(n);
}
- while ((r = TAILQ_FIRST(filter_l)) != NULL) {
- TAILQ_REMOVE(filter_l, r, entry);
- filterset_free(&r->set);
- free(r);
- }
-
- while ((r = TAILQ_FIRST(peerfilter_l)) != NULL) {
- TAILQ_REMOVE(peerfilter_l, r, entry);
- filterset_free(&r->set);
- free(r);
- }
+ filterlist_free(filter_l);
+ filterlist_free(peerfilter_l);
+ filterlist_free(groupfilter_l);
- while ((r = TAILQ_FIRST(groupfilter_l)) != NULL) {
- TAILQ_REMOVE(groupfilter_l, r, entry);
- filterset_free(&r->set);
- free(r);
- }
while ((rr = SIMPLEQ_FIRST(&ribnames)) != NULL) {
SIMPLEQ_REMOVE_HEAD(&ribnames, entry);
free(rr);
@@ -2712,25 +2699,16 @@ parse_config(char *filename, struct bgpd_config *xconf,
* together. Static group sets come first then peer sets
* last normal filter rules.
*/
- while ((r = TAILQ_FIRST(groupfilter_l)) != NULL) {
- TAILQ_REMOVE(groupfilter_l, r, entry);
- TAILQ_INSERT_TAIL(xfilter_l, r, entry);
- }
- while ((r = TAILQ_FIRST(peerfilter_l)) != NULL) {
- TAILQ_REMOVE(peerfilter_l, r, entry);
- TAILQ_INSERT_TAIL(xfilter_l, r, entry);
- }
- while ((r = TAILQ_FIRST(filter_l)) != NULL) {
- TAILQ_REMOVE(filter_l, r, entry);
- TAILQ_INSERT_TAIL(xfilter_l, r, entry);
- }
+ merge_filter_lists(xfilter_l, groupfilter_l);
+ merge_filter_lists(xfilter_l, peerfilter_l);
+ merge_filter_lists(xfilter_l, filter_l);
+ free(filter_l);
+ free(peerfilter_l);
+ free(groupfilter_l);
}
free(conf);
free(mrtconf);
- free(filter_l);
- free(peerfilter_l);
- free(groupfilter_l);
return (errors ? -1 : 0);
}
@@ -3563,6 +3541,17 @@ copy_filterset(struct filter_set_head *source, struct filter_set_head *dest)
}
}
+void
+merge_filter_lists(struct filter_head *dst, struct filter_head *src)
+{
+ struct filter_rule *r;
+
+ while ((r = TAILQ_FIRST(src)) != NULL) {
+ TAILQ_REMOVE(src, r, entry);
+ TAILQ_INSERT_TAIL(dst, r, entry);
+ }
+}
+
struct filter_rule *
get_rule(enum action_types type)
{
diff --git a/usr.sbin/bgpd/rde.c b/usr.sbin/bgpd/rde.c
index 723fabe1686..8624461f803 100644
--- a/usr.sbin/bgpd/rde.c
+++ b/usr.sbin/bgpd/rde.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde.c,v 1.329 2014/10/08 16:15:37 deraadt Exp $ */
+/* $OpenBSD: rde.c,v 1.330 2015/03/14 03:52:42 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -2669,12 +2669,12 @@ rde_reload_done(void)
/* dump the full table to neighbors that changed rib */
peer_dump(peer->conf.id, AID_UNSPEC);
}
- rde_free_filter(out_rules_tmp);
+ filterlist_free(out_rules_tmp);
out_rules_tmp = NULL;
for (rid = 0; rid < rib_size; rid++) {
if (*ribs[rid].name == '\0')
continue;
- rde_free_filter(ribs[rid].in_rules_tmp);
+ filterlist_free(ribs[rid].in_rules_tmp);
ribs[rid].in_rules_tmp = NULL;
ribs[rid].state = RECONF_NONE;
}
@@ -3542,11 +3542,11 @@ rde_shutdown(void)
peer_down(p->conf.id);
/* free filters */
- rde_free_filter(out_rules);
+ filterlist_free(out_rules);
for (i = 0; i < rib_size; i++) {
if (*ribs[i].name == '\0')
break;
- rde_free_filter(ribs[i].in_rules);
+ filterlist_free(ribs[i].in_rules);
}
nexthop_shutdown();
diff --git a/usr.sbin/bgpd/rde.h b/usr.sbin/bgpd/rde.h
index abafc19b10f..02b755d0888 100644
--- a/usr.sbin/bgpd/rde.h
+++ b/usr.sbin/bgpd/rde.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde.h,v 1.147 2013/08/14 20:34:26 claudio Exp $ */
+/* $OpenBSD: rde.h,v 1.148 2015/03/14 03:52:42 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org> and
@@ -326,7 +326,6 @@ u_int32_t rde_local_as(void);
int rde_noevaluate(void);
int rde_decisionflags(void);
int rde_as4byte(struct rde_peer *);
-void rde_free_filter(struct filter_head *);
/* rde_attr.c */
int attr_write(void *, u_int16_t, u_int8_t, u_int8_t, void *,
diff --git a/usr.sbin/bgpd/rde_filter.c b/usr.sbin/bgpd/rde_filter.c
index 68bfd0831d6..c75e61feae2 100644
--- a/usr.sbin/bgpd/rde_filter.c
+++ b/usr.sbin/bgpd/rde_filter.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde_filter.c,v 1.71 2014/01/24 06:07:13 phessler Exp $ */
+/* $OpenBSD: rde_filter.c,v 1.72 2015/03/14 03:52:42 claudio Exp $ */
/*
* Copyright (c) 2004 Claudio Jeker <claudio@openbsd.org>
@@ -440,7 +440,7 @@ rde_filter_equal(struct filter_head *a, struct filter_head *b,
}
void
-rde_free_filter(struct filter_head *fh)
+filterlist_free(struct filter_head *fh)
{
struct filter_rule *r;
diff --git a/usr.sbin/bgpd/rde_rib.c b/usr.sbin/bgpd/rde_rib.c
index 45e1ce4e304..fd2fb224e22 100644
--- a/usr.sbin/bgpd/rde_rib.c
+++ b/usr.sbin/bgpd/rde_rib.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde_rib.c,v 1.141 2014/12/18 19:28:44 tedu Exp $ */
+/* $OpenBSD: rde_rib.c,v 1.142 2015/03/14 03:52:42 claudio Exp $ */
/*
* Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org>
@@ -150,8 +150,8 @@ rib_free(struct rib *rib)
break;
}
}
- rde_free_filter(rib->in_rules_tmp);
- rde_free_filter(rib->in_rules);
+ filterlist_free(rib->in_rules_tmp);
+ filterlist_free(rib->in_rules);
bzero(rib, sizeof(struct rib));
}