ping
On 2016 Oct 04 (Tue) at 14:41:15 +0200 (+0200), Peter Hessler wrote:
:On 2016 Oct 04 (Tue) at 14:28:43 +0200 (+0200), Peter Hessler wrote:
::This updates bgpq3 to the now-released 0.1.32 version.
:
:Here is a patch that adds OpenBGPD support to bgpq3, expects the above
:version. I ignored adding support for as.dot notation (-D), and always
:set -3 (32bit asn). I didn't add -M (match condition), but that is
:marked as a Juniper-only feature, and I implemented -l to create a macro
:named 'name'.
:
:We use -B to declare "OpenBGPD" output format, and I tested:
:
: <as>
: -l <name>
: -A <as>
: -f <asnum> <as>
: -G <asnum> <as>
: -R 32 <as>
:
:where <as> is either as-set or aut-num.
:
:OK? (I will send to upstream once we like the output)
:
:
:Index: patches/patch-bgpq3_c
:===================================================================
:RCS file: patches/patch-bgpq3_c
:diff -N patches/patch-bgpq3_c
:--- /dev/null 1 Jan 1970 00:00:00 -0000
:+++ patches/patch-bgpq3_c 4 Oct 2016 11:16:52 -0000
:@@ -0,0 +1,50 @@
:+$OpenBSD$
:+--- bgpq3.c.orig Wed Sep 23 18:29:08 2015
:++++ bgpq3.c Tue Oct 4 13:16:40 2016
:+@@ -27,7 +27,7 @@ int
:+ usage(int ecode)
:+ {
:+ printf("\nUsage: bgpq3 [-h host[:port]] [-S sources] [-P|E|G <num>|f
<num>]"
:+- " [-2346AbDJjXd] [-R len] <OBJECTS>...\n");
:++ " [-2346AbBDJjXd] [-R len] <OBJECTS>...\n");
:+ printf(" -2 : allow routes belonging to as23456 (transition-as) "
:+ "(default: false)\n");
:+ printf(" -3 : assume that your device is asn32-safe\n");
:+@@ -36,6 +36,7 @@ usage(int ecode)
:+ printf(" -A : try to aggregate Cisco prefix-lists or Juniper "
:+ "route-filters\n as much as possible\n");
:+ printf(" -b : generate BIRD output (Cisco IOS by default)\n");
:++ printf(" -B : generate OpenBGPD output (Cisco IOS by
default)\n");
:+ printf(" -d : generate some debugging output\n");
:+ printf(" -D : use asdot notation in as-path (Cisco only)\n");
:+ printf(" -E : generate extended access-list(Cisco) or "
:+@@ -81,7 +82,7 @@ exclusive()
:+ void
:+ vendor_exclusive()
:+ {
:+- fprintf(stderr, "-b (BIRD), -F (formatted), -J (JunOS), -j (JSON) "
:++ fprintf(stderr, "-b (BIRD), -B (OpenBGPD), -F (formatted), -J (JunOS),
-j (JSON) "
:+ "and -X (IOS XR) options are mutually exclusive\n");
:+ exit(1);
:+ };
:+@@ -134,7 +135,7 @@ main(int argc, char* argv[])
:+ if (getenv("IRRD_SOURCES"))
:+ expander.sources=getenv("IRRD_SOURCES");
:+
:+- while((c=getopt(argc,argv,"2346AbdDEF:S:jJf:l:L:m:M:W:Ppr:R:G:Th:Xs"))
:++ while((c=getopt(argc,argv,"2346AbBdDEF:S:jJf:l:L:m:M:W:Ppr:R:G:Th:Xs"))
:+ !=EOF) {
:+ switch(c) {
:+ case '2':
:+@@ -167,6 +168,11 @@ main(int argc, char* argv[])
:+ case 'b':
:+ if(expander.vendor) vendor_exclusive();
:+ expander.vendor=V_BIRD;
:++ break;
:++ case 'B':
:++ if(expander.vendor) vendor_exclusive();
:++ expander.vendor=V_OPENBGPD;
:++ expander.asn32=1;
:+ break;
:+ case 'd': debug_expander++;
:+ break;
:Index: patches/patch-bgpq3_h
:===================================================================
:RCS file: patches/patch-bgpq3_h
:diff -N patches/patch-bgpq3_h
:--- /dev/null 1 Jan 1970 00:00:00 -0000
:+++ patches/patch-bgpq3_h 8 Jan 2016 17:52:43 -0000
:@@ -0,0 +1,11 @@
:+$OpenBSD$
:+--- bgpq3.h.orig Fri Jan 8 18:52:16 2016
:++++ bgpq3.h Fri Jan 8 18:52:39 2016
:+@@ -16,6 +16,7 @@ typedef enum {
:+ V_CISCO_XR,
:+ V_JSON,
:+ V_BIRD,
:++ V_OPENBGPD,
:+ V_FORMAT
:+ } bgpq_vendor_t;
:+
:Index: patches/patch-bgpq3_printer_c
:===================================================================
:RCS file: patches/patch-bgpq3_printer_c
:diff -N patches/patch-bgpq3_printer_c
:--- /dev/null 1 Jan 1970 00:00:00 -0000
:+++ patches/patch-bgpq3_printer_c 4 Oct 2016 11:34:36 -0000
:@@ -0,0 +1,159 @@
:+$OpenBSD$
:+--- bgpq3_printer.c.orig Sun Aug 28 18:18:20 2016
:++++ bgpq3_printer.c Tue Oct 4 13:34:25 2016
:+@@ -18,6 +18,7 @@ extern int debug_expander;
:+
:+ int bgpq3_print_json_aspath(FILE* f, struct bgpq_expander* b);
:+ int bgpq3_print_bird_aspath(FILE* f, struct bgpq_expander* b);
:++int bgpq3_print_openbgpd_aspath(FILE* f, struct bgpq_expander* b);
:+
:+ int
:+ bgpq3_print_cisco_aspath(FILE* f, struct bgpq_expander* b)
:+@@ -304,6 +305,25 @@ bgpq3_print_juniper_oaspath(FILE* f, struct bgpq_expan
:+ };
:+
:+ int
:++bgpq3_print_openbgpd_oaspath(FILE* f, struct bgpq_expander* b)
:++{
:++ int i, j, k;
:++
:++ for(k=0;k<65536;k++) {
:++ if(!b->asn32s[k]) continue;
:++
:++ for(i=0;i<8192;i++) {
:++ for(j=0;j<8;j++) {
:++ if(b->asn32s[k][i]&(0x80>>j)) {
:++ fprintf(f, "%s%u%s%u\n", "allow to AS
", b->asnumber, " AS ", k*65536+i*8+j);
:++ };
:++ };
:++ };
:++ };
:++ return 0;
:++};
:++
:++int
:+ bgpq3_print_aspath(FILE* f, struct bgpq_expander* b)
:+ {
:+ if(b->vendor==V_JUNIPER) {
:+@@ -316,6 +336,8 @@ bgpq3_print_aspath(FILE* f, struct bgpq_expander* b)
:+ return bgpq3_print_json_aspath(f,b);
:+ } else if(b->vendor==V_BIRD) {
:+ return bgpq3_print_bird_aspath(f,b);
:++ } else if(b->vendor==V_OPENBGPD) {
:++ return bgpq3_print_openbgpd_aspath(f,b);
:+ } else {
:+ sx_report(SX_FATAL,"Unknown vendor %i\n", b->vendor);
:+ };
:+@@ -331,6 +353,8 @@ bgpq3_print_oaspath(FILE* f, struct bgpq_expander* b)
:+ return bgpq3_print_cisco_oaspath(f,b);
:+ } else if(b->vendor==V_CISCO_XR) {
:+ return bgpq3_print_cisco_xr_oaspath(f,b);
:++ } else if(b->vendor==V_OPENBGPD) {
:++ return bgpq3_print_openbgpd_oaspath(f,b);
:+ } else {
:+ sx_report(SX_FATAL,"Unknown vendor %i\n", b->vendor);
:+ };
:+@@ -472,6 +496,53 @@ bgpq3_print_bird_aspath(FILE* f, struct bgpq_expander*
:+ };
:+
:+ void
:++bgpq3_print_openbgpd_prefix(struct sx_radix_node* n, void* ff)
:++{
:++ char prefix[128];
:++ FILE* f=(FILE*)ff;
:++ if(n->isGlue)
:++ goto checkSon;
:++ if(!f)
:++ f=stdout;
:++ sx_prefix_snprintf(&n->prefix, prefix, sizeof(prefix));
:++ if (!n->isAggregate) {
:++ fprintf(f, "\n\t%s \\", prefix);
:++ } else if (n->aggregateLow == n->aggregateHi) {
:++ fprintf(f, "\n\t%s prefixlen = %u \\",
:++ prefix, n->aggregateHi);
:++ } else if (n->aggregateLow > n->prefix.masklen) {
:++ fprintf(f, "\n\t%s prefixlen %u - %u \\",
:++ prefix, n->aggregateLow, n->aggregateHi);
:++ } else {
:++ fprintf(f, "\n\t%s prefixlen %u - %u \\",
:++ prefix, n->prefix.masklen, n->aggregateHi);
:++ };
:++ needscomma=1;
:++checkSon:
:++ if(n->son)
:++ bgpq3_print_openbgpd_prefix(n->son, ff);
:++};
:++
:++int
:++bgpq3_print_openbgpd_aspath(FILE* f, struct bgpq_expander* b)
:++{
:++ int i, j, k;
:++
:++ for(k=0;k<65536;k++) {
:++ if(!b->asn32s[k]) continue;
:++
:++ for(i=0;i<8192;i++) {
:++ for(j=0;j<8;j++) {
:++ if(b->asn32s[k][i]&(0x80>>j)) {
:++ fprintf(f, "%s%u%s%u\n", "allow from AS
", b->asnumber, " AS ", k*65536+i*8+j);
:++ };
:++ };
:++ };
:++ };
:++ return 0;
:++};
:++
:++void
:+ bgpq3_print_jrfilter(struct sx_radix_node* n, void* ff)
:+ {
:+ char prefix[128];
:+@@ -658,7 +729,33 @@ bgpq3_print_juniper_routefilter(FILE* f, struct bgpq_e
:+ return 0;
:+ };
:+
:++
:+ int
:++bgpq3_print_openbgpd_prefixlist(FILE* f, struct bgpq_expander* b)
:++{
:++ if (!sx_radix_tree_empty(b->tree)) {
:++ if(b->name){
:++ if(strcmp(b->name, "NN") != 0) {
:++ fprintf(f, "%s=\"", b->name);
:++ }
:++ }
:++ fprintf(f,"prefix { \\");
:++ sx_radix_tree_foreach(b->tree,bgpq3_print_openbgpd_prefix,f);
:++ fprintf(f, "\n\t}");
:++ if(b->name){
:++ if(strcmp(b->name, "NN") != 0) {
:++ fprintf(f, "\"");
:++ }
:++ }
:++ fprintf(f, "\n");
:++ } else {
:++ fprintf(f, "# generated prefix-list %s (AS %u) is empty\n",
bname, b->asnumber);
:++ fprintf(f, "deny from AS %u\n", b->asnumber);
:++ };
:++ return 0;
:++};
:++
:++int
:+ bgpq3_print_cisco_prefixlist(FILE* f, struct bgpq_expander* b)
:+ {
:+ bname=b->name ? b->name : "NN";
:+@@ -767,6 +864,7 @@ bgpq3_print_prefixlist(FILE* f, struct bgpq_expander*
:+ case V_CISCO_XR: return bgpq3_print_ciscoxr_prefixlist(f,b);
:+ case V_JSON: return bgpq3_print_json_prefixlist(f,b);
:+ case V_BIRD: return bgpq3_print_bird_prefixlist(f,b);
:++ case V_OPENBGPD: return bgpq3_print_openbgpd_prefixlist(f,b);
:+ case V_FORMAT: return bgpq3_print_format_prefixlist(f,b);
:+ };
:+ return 0;
:+@@ -781,6 +879,7 @@ bgpq3_print_eacl(FILE* f, struct bgpq_expander* b)
:+ case V_CISCO_XR: sx_report(SX_FATAL, "unreachable point\n");
:+ case V_JSON: sx_report(SX_FATAL, "unreachable point\n");
:+ case V_BIRD: sx_report(SX_FATAL, "unreachable point\n");
:++ case V_OPENBGPD: return bgpq3_print_openbgpd_prefixlist(f,b);
:+ case V_FORMAT: sx_report(SX_FATAL, "unreachable point\n");
:+ };
:+ return 0;
:
:
:--
:Never let your sense of morals prevent you from doing what is right.
: -- Salvor Hardin, "Foundation"
:
--
New systems generate new problems.