diff --git a/bgpq3.h b/bgpq3.h index 3219394..0f48221 100644 --- a/bgpq3.h +++ b/bgpq3.h @@ -33,5 +33,11 @@ int bgpq_expander_add_asset(struct bgpq_expander* b, char* set); int bgpq_expander_add_as(struct bgpq_expander* b, char* as); int bgpq_expander_add_prefix(struct bgpq_expander* b, char* prefix); +int bgpq_expand(struct bgpq_expander* b); + +int bgpq3_print_prefixlist(FILE* f, struct bgpq_expander* b); +int bgpq3_print_aspath(FILE* f, struct bgpq_expander* b); + + #endif diff --git a/bgpq3_printer.c b/bgpq3_printer.c index b4cb8d3..cc29c27 100644 --- a/bgpq3_printer.c +++ b/bgpq3_printer.c @@ -98,18 +98,41 @@ bgpq3_print_jprefix(struct sx_radix_node* n, void* ff) { char prefix[128]; FILE* f=(FILE*)ff; + if(n->isGlue) return; if(!f) f=stdout; - sx_prefix_snprintf(&n->prefix,prefix,sizeof(prefix)); - fprintf(f," %s; (%i)\n",prefix,n->isGlue); + fprintf(f," %s;\n",prefix); +}; + +static char* bname=NULL; + +void +bgpq3_print_cprefix(struct sx_radix_node* n, void* ff) +{ + char prefix[128]; + FILE* f=(FILE*)ff; + if(n->isGlue) return; + if(!f) f=stdout; + sx_prefix_snprintf(&n->prefix,prefix,sizeof(prefix)); + fprintf(f,"ip prefix-list %s permit %s\n",bname?bname:"UNKNOWN",prefix); }; - int bgpq3_print_juniper_prefixlist(FILE* f, struct bgpq_expander* b) { - printf("prefix-printer called\n"); - sx_radix_tree_foreach(b->tree,bgpq3_print_jprefix,stdout); + fprintf(f,"policy-options {\nreplace:\n prefix-list %s {\n", + b->name?b->name:"UNKNOWN"); + sx_radix_tree_foreach(b->tree,bgpq3_print_jprefix,f); + fprintf(f," }\n}\n"); + return 0; +}; + +int +bgpq3_print_cisco_prefixlist(FILE* f, struct bgpq_expander* b) +{ + bname=b->name; + fprintf(f,"no ip prefix-list %s\n", bname); + sx_radix_tree_foreach(b->tree,bgpq3_print_cprefix,f); return 0; }; @@ -118,6 +141,7 @@ bgpq3_print_prefixlist(FILE* f, struct bgpq_expander* b) { switch(b->vendor) { case V_JUNIPER: return bgpq3_print_juniper_prefixlist(f,b); + case V_CISCO: return bgpq3_print_cisco_prefixlist(f,b); }; return 0; }; diff --git a/bgpq_expander.c b/bgpq_expander.c index 79f6d23..02e0579 100644 --- a/bgpq_expander.c +++ b/bgpq_expander.c @@ -17,6 +17,8 @@ #include "bgpq3.h" #include "sx_report.h" +int debug_expander=1; + int bgpq_expander_init(struct bgpq_expander* b, int af) { @@ -30,6 +32,7 @@ bgpq_expander_init(struct bgpq_expander* b, int af) b->family=af; b->sources="ripe,radb,apnic"; + b->name="UNKNOWN"; b->aswidth=8; return 1; @@ -113,7 +116,6 @@ bgpq_expanded_prefix(char* as, void* udata) { struct bgpq_expander* ex=(struct bgp_expander*)udata; if(!ex) return 0; -printf("expanded prefix %s\n", as); bgpq_expander_add_prefix(ex,as); return 1; }; @@ -130,6 +132,8 @@ bgpq_expand_radb(int fd, int (*callback)(char*, void*), void* udata, vsnprintf(request,sizeof(request),fmt,ap); va_end(ap); + SX_DEBUG(debug_expander,"expander: sending '%s'\n", request); + write(fd,request,strlen(request)); memset(request,0,sizeof(request)); ret=read(fd,request,sizeof(request)-1);