From ead55ffd29acd40823342710ae6c6390dc7156fb Mon Sep 17 00:00:00 2001 From: Sebastian Benoit Date: Fri, 6 Mar 2020 17:36:43 +0000 Subject: generate 3 different outputs for BIRD: - bird v1 with IPv4 routes - bird v1 with IPv6 routes - bird v2 when using command line option -B. BIRD v2 output from Robert Scheck, robert AT fedoraproject DOT org time_t cast hint from jca@, and tested by job@ ok deraadt@ claudio@ --- usr.sbin/rpki-client/extern.h | 6 ++- usr.sbin/rpki-client/output-bird.c | 79 +++++++++++++++++++++++++++++++++++--- usr.sbin/rpki-client/output.c | 6 ++- 3 files changed, 82 insertions(+), 9 deletions(-) (limited to 'usr.sbin') diff --git a/usr.sbin/rpki-client/extern.h b/usr.sbin/rpki-client/extern.h index 127db60fa37..9ca0d4d2441 100644 --- a/usr.sbin/rpki-client/extern.h +++ b/usr.sbin/rpki-client/extern.h @@ -1,4 +1,4 @@ -/* $OpenBSD: extern.h,v 1.23 2019/12/06 09:27:12 claudio Exp $ */ +/* $OpenBSD: extern.h,v 1.24 2020/03/06 17:36:42 benno Exp $ */ /* * Copyright (c) 2019 Kristaps Dzonsons * @@ -374,7 +374,9 @@ FILE *output_createtmp(char *); void output_cleantmp(void); void output_finish(FILE *); int output_bgpd(FILE *, struct vrp_tree *); -int output_bird(FILE *, struct vrp_tree *); +int output_bird1v4(FILE *, struct vrp_tree *); +int output_bird1v6(FILE *, struct vrp_tree *); +int output_bird2(FILE *, struct vrp_tree *); int output_csv(FILE *, struct vrp_tree *); int output_json(FILE *, struct vrp_tree *); diff --git a/usr.sbin/rpki-client/output-bird.c b/usr.sbin/rpki-client/output-bird.c index a15faa69164..e9067b402ed 100644 --- a/usr.sbin/rpki-client/output-bird.c +++ b/usr.sbin/rpki-client/output-bird.c @@ -1,6 +1,7 @@ -/* $OpenBSD: output-bird.c,v 1.6 2019/12/04 23:03:05 benno Exp $ */ +/* $OpenBSD: output-bird.c,v 1.7 2020/03/06 17:36:42 benno Exp $ */ /* * Copyright (c) 2019 Claudio Jeker + * Copyright (c) 2020 Robert Scheck * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -21,7 +22,7 @@ #include "extern.h" int -output_bird(FILE *out, struct vrp_tree *vrps) +output_bird1v4(FILE *out, struct vrp_tree *vrps) { extern const char *bird_tablename; char buf[64]; @@ -31,10 +32,78 @@ output_bird(FILE *out, struct vrp_tree *vrps) return -1; RB_FOREACH(v, vrp_tree, vrps) { - ip_addr_print(&v->addr, v->afi, buf, sizeof(buf)); - if (fprintf(out, "\troa %s max %u as %u;\n", buf, v->maxlength, - v->asid) < 0) + if (v->afi == AFI_IPV4) { + ip_addr_print(&v->addr, v->afi, buf, sizeof(buf)); + if (fprintf(out, "\troa %s max %u as %u;\n", buf, + v->maxlength, v->asid) < 0) + return -1; + } + } + + if (fprintf(out, "}\n") < 0) return -1; + return 0; +} + +int +output_bird1v6(FILE *out, struct vrp_tree *vrps) +{ + extern const char *bird_tablename; + char buf[64]; + struct vrp *v; + + if (fprintf(out, "roa table %s {\n", bird_tablename) < 0) + return -1; + + RB_FOREACH(v, vrp_tree, vrps) { + if (v->afi == AFI_IPV6) { + ip_addr_print(&v->addr, v->afi, buf, sizeof(buf)); + if (fprintf(out, "\troa %s max %u as %u;\n", buf, + v->maxlength, v->asid) < 0) + return -1; + } + } + + if (fprintf(out, "}\n") < 0) + return -1; + return 0; +} + +int +output_bird2(FILE *out, struct vrp_tree *vrps) +{ + extern const char *bird_tablename; + char buf[64]; + struct vrp *v; + time_t now = time(NULL); + + if (fprintf(out, "define force_roa_table_update = %lld;\n\n" + "roa4 table %s4;\nroa6 table %s6;\n\n" + "protocol static {\n\troa4 { table %s4; };\n\n", + (long long) now, bird_tablename, bird_tablename, + bird_tablename) < 0) + return -1; + + RB_FOREACH(v, vrp_tree, vrps) { + if (v->afi == AFI_IPV4) { + ip_addr_print(&v->addr, v->afi, buf, sizeof(buf)); + if (fprintf(out, "\troute %s max %u as %u;\n", buf, + v->maxlength, v->asid) < 0) + return -1; + } + } + + if (fprintf(out, "}\n\nprotocol static {\n\troa6 { table %s6; };\n\n", + bird_tablename) < 0) + return -1; + + RB_FOREACH(v, vrp_tree, vrps) { + if (v->afi == AFI_IPV6) { + ip_addr_print(&v->addr, v->afi, buf, sizeof(buf)); + if (fprintf(out, "\troute %s max %u as %u;\n", buf, + v->maxlength, v->asid) < 0) + return -1; + } } if (fprintf(out, "}\n") < 0) diff --git a/usr.sbin/rpki-client/output.c b/usr.sbin/rpki-client/output.c index adafc5c0b53..41c2a87b690 100644 --- a/usr.sbin/rpki-client/output.c +++ b/usr.sbin/rpki-client/output.c @@ -1,4 +1,4 @@ -/* $OpenBSD: output.c,v 1.5 2019/12/19 16:32:44 claudio Exp $ */ +/* $OpenBSD: output.c,v 1.6 2020/03/06 17:36:42 benno Exp $ */ /* * Copyright (c) 2019 Theo de Raadt * @@ -40,7 +40,9 @@ struct outputs { int (*fn)(FILE *, struct vrp_tree *); } outputs[] = { { FORMAT_OPENBGPD, "openbgpd", output_bgpd }, - { FORMAT_BIRD, "bird", output_bird }, + { FORMAT_BIRD, "bird1v4", output_bird1v4 }, + { FORMAT_BIRD, "bird1v6", output_bird1v6 }, + { FORMAT_BIRD, "bird", output_bird2 }, { FORMAT_CSV, "csv", output_csv }, { FORMAT_JSON, "json", output_json }, { 0, NULL } -- cgit v1.2.3