1
0
mirror of https://github.com/bgp/bgpq4.git synced 2024-05-11 05:55:05 +00:00

Initial support for ASN32 (RFC4893), Juniper only for now

This commit is contained in:
snar
2008-05-16 15:19:09 +00:00
parent 0fd07485ff
commit 49984acc34
4 changed files with 105 additions and 44 deletions

19
bgpq3.c
View File

@ -21,14 +21,15 @@ extern int debug_expander;
int
usage(int ecode)
{
printf("Usage: bgpq3 [-h] [-S sources] [-P|G <number>|f <number>] [-6]"
printf("Usage: bgpq3 [-h] [-S sources] [-P|G <number>|f <number>] [-36]"
" <OBJECTS>...\n");
printf(" -6 : generate IPv6 access/prefix-lists\n");
printf(" -3 : assume that your device is asn32-safe\n");
printf(" -6 : generate IPv6 prefix-lists (IPv4 by default)\n");
printf(" -d : generate some debugging output\n");
printf(" -f number : generate input as-path access-list\n");
printf(" -G number : generate output as-path access-list\n");
printf(" -h : this help\n");
printf(" -J : use Juniper replace formatted output\n");
printf(" -J : generate config for JunOS (Cisco IOS by default)\n");
printf(" -l : use specified name for generated access/prefix/.."
" list\n");
printf(" -P : generate prefix-list (default)\n");
@ -56,8 +57,11 @@ main(int argc, char* argv[])
bgpq_expander_init(&expander,af);
expander.sources=getenv("IRRD_SOURCES");
while((c=getopt(argc,argv,"6dhS:Jf:l:W:PG:"))!=EOF) {
while((c=getopt(argc,argv,"36dhS:Jf:l:W:PG:"))!=EOF) {
switch(c) {
case '3':
expander.asn32=1;
break;
case '6': af=AF_INET6;
expander.family=AF_INET6;
expander.tree->family=AF_INET6;
@ -125,6 +129,13 @@ main(int argc, char* argv[])
expander.generation=T_PREFIXLIST;
};
if(expander.vendor==V_CISCO && expander.asn32 &&
expander.generation<T_PREFIXLIST) {
sx_report(SX_FATAL,"Sorry, AS32-safety is not yet ready for Cisco\n");
};
if(!argv[0]) usage(1);
while(argv[0]) {

View File

@ -18,7 +18,6 @@ typedef enum {
struct bgpq_expander {
struct sx_radix_tree* tree;
unsigned char asnumbers[8192];
struct sx_slentry* macroses;
int family;
char* sources;
@ -27,6 +26,8 @@ struct bgpq_expander {
bgpq_vendor_t vendor;
bgpq_gen_t generation;
int identify;
unsigned char asn32;
unsigned char* asn32s[65536];
};
int bgpq_expander_init(struct bgpq_expander* b, int af);

View File

@ -17,13 +17,13 @@ bgpq3_print_cisco_aspath(FILE* f, struct bgpq_expander* b)
{
int nc=0, i, j;
fprintf(f,"no ip as-path access-list %s\n", b->name?b->name:"NN");
if(b->asnumbers[b->asnumber/8]&(0x80>>(b->asnumber%8))) {
if(b->asn32s[0][b->asnumber/8]&(0x80>>(b->asnumber%8))) {
fprintf(f,"ip as-path access-list %s permit ^%i(_%i)*$\n",
b->name?b->name:"NN",b->asnumber,b->asnumber);
};
for(i=0;i<sizeof(b->asnumbers);i++) {
for(i=0;i<8192;i++) {
for(j=0;j<8;j++) {
if(b->asnumbers[i]&(0x80>>j)) {
if(b->asn32s[0][i]&(0x80>>j)) {
if(i*8+j==b->asnumber) continue;
if(!nc) {
fprintf(f,"ip as-path access-list %s permit"
@ -48,13 +48,13 @@ bgpq3_print_cisco_oaspath(FILE* f, struct bgpq_expander* b)
{
int nc=0, i, j;
fprintf(f,"no ip as-path access-list %s\n", b->name?b->name:"NN");
if(b->asnumbers[b->asnumber/8]&(0x80>>(b->asnumber%8))) {
if(b->asn32s[0][b->asnumber/8]&(0x80>>(b->asnumber%8))) {
fprintf(f,"ip as-path access-list %s permit ^(_%i)*$\n",
b->name?b->name:"NN",b->asnumber);
};
for(i=0;i<sizeof(b->asnumbers);i++) {
for(i=0;i<8192;i++) {
for(j=0;j<8;j++) {
if(b->asnumbers[i]&(0x80>>j)) {
if(b->asn32s[0][i]&(0x80>>j)) {
if(i*8+j==b->asnumber) continue;
if(!nc) {
fprintf(f,"ip as-path access-list %s permit"
@ -78,30 +78,42 @@ bgpq3_print_cisco_oaspath(FILE* f, struct bgpq_expander* b)
int
bgpq3_print_juniper_aspath(FILE* f, struct bgpq_expander* b)
{
int nc=0, lineNo=0, i, j;
int nc=0, lineNo=0, i, j, k;
fprintf(f,"policy-options {\nreplace:\n as-path-group %s {\n",
b->name?b->name:"NN");
if(b->asnumbers[b->asnumber/8]&(0x80>>(b->asnumber%8))) {
if(b->asn32s[0][b->asnumber/8]&(0x80>>(b->asnumber%8))) {
fprintf(f," as-path a%i \"^%i(%i)*$\";\n", lineNo, b->asnumber,
b->asnumber);
lineNo++;
};
for(i=0;i<sizeof(b->asnumbers);i++) {
for(j=0;j<8;j++) {
if(b->asnumbers[i]&(0x80>>j)) {
if(i*8+j==b->asnumber) continue;
if(!nc) {
fprintf(f," as-path a%i \"^%i(.)*(%i",
lineNo,b->asnumber,i*8+j);
} else {
fprintf(f,"|%i",i*8+j);
}
nc++;
if(nc==b->aswidth) {
fprintf(f,")$\";\n");
nc=0;
lineNo++;
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)) {
if(i*8+j==b->asnumber) continue;
if(!nc) {
if(k) {
fprintf(f," as-path a%i \"^%i(.)*(%u.%u",
lineNo,b->asnumber,k,i*8+j);
} else {
fprintf(f," as-path a%i \"^%i(.)*(%u",
lineNo,b->asnumber,i*8+j);
};
} else {
if(k) {
fprintf(f,"|%u.%u",k,i*8+j);
} else {
fprintf(f,"|%u",i*8+j);
};
};
nc++;
if(nc==b->aswidth) {
fprintf(f,")$\";\n");
nc=0;
lineNo++;
};
};
};
};
@ -118,14 +130,14 @@ bgpq3_print_juniper_oaspath(FILE* f, struct bgpq_expander* b)
fprintf(f,"policy-options {\nreplace:\n as-path-group %s {\n",
b->name?b->name:"NN");
if(b->asnumbers[b->asnumber/8]&(0x80>>(b->asnumber%8))) {
if(b->asn32s[0][b->asnumber/8]&(0x80>>(b->asnumber%8))) {
fprintf(f," as-path a%i \"^%i(%i)*$\";\n", lineNo, b->asnumber,
b->asnumber);
lineNo++;
};
for(i=0;i<sizeof(b->asnumbers);i++) {
for(i=0;i<8192;i++) {
for(j=0;j<8;j++) {
if(b->asnumbers[i]&(0x80>>j)) {
if(b->asn32s[0][i]&(0x80>>j)) {
if(i*8+j==b->asnumber) continue;
if(!nc) {
fprintf(f," as-path a%i \"^(.)*(%i",
@ -204,7 +216,7 @@ bgpq3_print_juniper_prefixlist(FILE* f, struct bgpq_expander* b)
fprintf(f,"policy-options {\nreplace:\n prefix-list %s {\n",
b->name?b->name:"NN");
sx_radix_tree_foreach(b->tree,bgpq3_print_jprefix,f);
fprintf(f," }\n}\n");
fprintf(f," }\n}\n");
return 0;
};

View File

@ -35,6 +35,7 @@ bgpq_expander_init(struct bgpq_expander* b, int af)
b->sources="ripe,radb,apnic";
b->name="NN";
b->aswidth=8;
b->asn32s[0]=malloc(8192);
return 1;
fixups:
@ -77,7 +78,31 @@ bgpq_expander_add_as(struct bgpq_expander* b, char* as)
};
if(*eoa=='.') {
sx_report(SX_ERROR,"32-bit as numbers is not supported yet (%s)\n",as);
if(b->asn32 || b->generation>=T_PREFIXLIST) {
uint32_t asn1=strtoul(eoa+1,&eoa,10);
if(eoa && *eoa!=0) {
sx_report(SX_ERROR,"Invalid symbol in AS number: '%c' in %s\n",
*eoa, as);
return 0;
};
if(asn1<1 || asn1>65535) {
sx_report(SX_ERROR,"Invalid AS number in %s\n", as);
return 0;
};
if(!b->asn32s[asno]) {
b->asn32s[asno]=malloc(8192);
if(!b->asn32s[asno]) {
sx_report(SX_ERROR, "Unable to allocate 8192 bytes: %s."
" Unable to add asn32 %s to future expansion\n",
strerror(errno), as);
return 0;
};
memset(b->asn32s[asno],0,8192);
};
b->asn32s[asno][asn1/8]|=(0x80>>(asn1%8));
} else if(!b->asn32) {
b->asn32s[0][23456/8]|=(0x80>>(23456%8));
};
return 0;
};
@ -86,7 +111,7 @@ bgpq_expander_add_as(struct bgpq_expander* b, char* as)
return 0;
};
b->asnumbers[asno/8]|=(0x80>>(asno%8));
b->asn32s[0][asno/8]|=(0x80>>(asno%8));
return 1;
};
@ -369,16 +394,28 @@ bgpq_expand(struct bgpq_expander* b)
bgpq_expand_radb(f,bgpq_expanded_macro,b,"!i%s,1\n",mc->text);
};
if(b->generation>=T_PREFIXLIST) {
int i, j;
for(i=0;i<sizeof(b->asnumbers);i++) {
for(j=0;j<8;j++) {
if(b->asnumbers[i]&(0x80>>j)) {
if(b->family==AF_INET6) {
bgpq_expand_ripe(f,bgpq_expanded_v6prefix,b,
"-i origin as%i\r\n",i*8+j);
} else {
bgpq_expand_radb(f,bgpq_expanded_prefix,b,"!gas%i\n",
i*8+j);
unsigned i, j, k;
for(k=0;k<sizeof(b->asn32s)/sizeof(unsigned char*);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)) {
if(b->family==AF_INET6) {
if(k>0)
bgpq_expand_ripe(f,bgpq_expanded_v6prefix,b,
"-i origin as%u.%u\r\n", k, i*8+j);
else
bgpq_expand_ripe(f,bgpq_expanded_v6prefix,b,
"-i origin as%u\r\n", i*8+j);
} else {
if(k>0)
bgpq_expand_radb(f,bgpq_expanded_prefix,b,
"!gas%u.%u\n", k, i*8+j);
else
bgpq_expand_radb(f,bgpq_expanded_prefix,b,
"!gas%u\n", i*8+j);
};
};
};
};