mirror of
https://github.com/bgp/bgpq4
synced 2025-02-28 08:53:11 +00:00
Support of Nokia (former Alcatel-Lucent) SR OS
This commit is contained in:
@@ -59,7 +59,7 @@ Use asdot notation for Cisco as-path access-lists.
|
||||
#### -E
|
||||
|
||||
Generate extended access-list (Cisco) or policy-statement term using
|
||||
route-filters (Juniper).
|
||||
route-filters (Juniper) or [ip|ipv6]-prefix-list (Nokia)
|
||||
|
||||
#### -f `AS number`
|
||||
|
||||
@@ -93,6 +93,10 @@ Maximum length of accepted prefixes (default: `32` for IPv4, `128` for IPv6).
|
||||
|
||||
Extra match conditions for Juniper route-filters. See the examples section.
|
||||
|
||||
#### -N
|
||||
|
||||
Generate config for Nokia SR OS (former Alcatel-Lucent) (default: Cisco)
|
||||
|
||||
#### -l `name`
|
||||
|
||||
`Name` of generated configuration stanza.
|
||||
|
||||
12
bgpq3.c
12
bgpq3.c
@@ -55,6 +55,7 @@ usage(int ecode)
|
||||
printf(" -L depth : limit recursion depth (default: unlimited)\n"),
|
||||
printf(" -l name : use specified name for generated access/prefix/.."
|
||||
" list\n");
|
||||
printf(" -N : generate config for Nokia SR OS (Cisco IOS by default)\n");
|
||||
printf(" -P : generate prefix-list (default, just for backward"
|
||||
" compatibility)\n");
|
||||
printf(" -R len : allow more specific routes up to specified masklen\n");
|
||||
@@ -83,7 +84,7 @@ void
|
||||
vendor_exclusive()
|
||||
{
|
||||
fprintf(stderr, "-b (BIRD), -B (OpenBGPD), -F (formatted), -J (JunOS), "
|
||||
"-j (JSON) and -X (IOS XR) options are mutually exclusive\n");
|
||||
"-j (JSON), -N (NOKIA SR OS) and -X (IOS XR) options are mutually exclusive\n");
|
||||
exit(1);
|
||||
};
|
||||
|
||||
@@ -135,7 +136,7 @@ main(int argc, char* argv[])
|
||||
if (getenv("IRRD_SOURCES"))
|
||||
expander.sources=getenv("IRRD_SOURCES");
|
||||
|
||||
while((c=getopt(argc,argv,"2346AbBdDEF:S:jJf:l:L:m:M:W:Ppr:R:G:Th:Xs"))
|
||||
while((c=getopt(argc,argv,"2346AbBdDEF:S:jJf:l:L:m:M:NW:Ppr:R:G:Th:Xs"))
|
||||
!=EOF) {
|
||||
switch(c) {
|
||||
case '2':
|
||||
@@ -284,6 +285,9 @@ main(int argc, char* argv[])
|
||||
*d=0;
|
||||
};
|
||||
break;
|
||||
case 'N': if(expander.vendor) vendor_exclusive();
|
||||
expander.vendor=V_NOKIA;
|
||||
break;
|
||||
case 'T': pipelining=0;
|
||||
break;
|
||||
case 's': expander.sequence=1;
|
||||
@@ -317,6 +321,8 @@ main(int argc, char* argv[])
|
||||
expander.aswidth=8;
|
||||
} else if(expander.vendor==V_BIRD) {
|
||||
expander.aswidth=10;
|
||||
} else if(expander.vendor==V_NOKIA) {
|
||||
expander.aswidth=8;
|
||||
};
|
||||
} else if(expander.generation==T_OASPATH) {
|
||||
if(expander.vendor==V_CISCO) {
|
||||
@@ -325,6 +331,8 @@ main(int argc, char* argv[])
|
||||
expander.aswidth=7;
|
||||
} else if(expander.vendor==V_JUNIPER) {
|
||||
expander.aswidth=8;
|
||||
} else if(expander.vendor==V_NOKIA) {
|
||||
expander.aswidth=8;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
3
bgpq3.h
3
bgpq3.h
@@ -17,7 +17,8 @@ typedef enum {
|
||||
V_JSON,
|
||||
V_BIRD,
|
||||
V_OPENBGPD,
|
||||
V_FORMAT
|
||||
V_FORMAT,
|
||||
V_NOKIA
|
||||
} bgpq_vendor_t;
|
||||
|
||||
typedef enum {
|
||||
|
||||
164
bgpq3_printer.c
164
bgpq3_printer.c
@@ -323,6 +323,97 @@ bgpq3_print_openbgpd_oaspath(FILE* f, struct bgpq_expander* b)
|
||||
return 0;
|
||||
};
|
||||
|
||||
int
|
||||
bgpq3_print_nokia_aspath(FILE* f, struct bgpq_expander* b)
|
||||
{
|
||||
int nc=0, lineNo=1, i, j, k;
|
||||
|
||||
fprintf(f,"configure router policy-options\nbegin\nno as-path-group \"%s\"\n",
|
||||
b->name ? b->name : "NN");
|
||||
fprintf(f,"as-path-group \"%s\"\n", b->name ? b->name : "NN");
|
||||
|
||||
if(b->asn32s[b->asnumber/65536] &&
|
||||
b->asn32s[b->asnumber/65535][(b->asnumber%65536)/8]&
|
||||
(0x80>>(b->asnumber%8))) {
|
||||
fprintf(f," entry %u expression \"^%u(%u)*$\"\n", lineNo, b->asnumber,
|
||||
b->asnumber);
|
||||
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(k*65536+i*8+j==b->asnumber) continue;
|
||||
if(!nc) {
|
||||
fprintf(f," entry %u expression \"^%u(.)*(%u",
|
||||
lineNo,b->asnumber,k*65536+i*8+j);
|
||||
} else {
|
||||
fprintf(f,"|%u",k*65536+i*8+j);
|
||||
};
|
||||
nc++;
|
||||
if(nc==b->aswidth) {
|
||||
fprintf(f,")$\"\n");
|
||||
nc=0;
|
||||
lineNo++;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
if(nc) fprintf(f,")$\"\n");
|
||||
else if(lineNo==1)
|
||||
fprintf(f," entry 1 \"!.*\"\n");
|
||||
fprintf(f,"exit\ncommit\n");
|
||||
return 0;
|
||||
};
|
||||
|
||||
int
|
||||
bgpq3_print_nokia_oaspath(FILE* f, struct bgpq_expander* b)
|
||||
{
|
||||
int nc=0, lineNo=1, i, j, k;
|
||||
|
||||
fprintf(f,"configure router policy-options\nbegin\nno as-path-group \"%s\"\n",
|
||||
b->name ? b->name : "NN");
|
||||
fprintf(f,"as-path-group \"%s\"\n", b->name ? b->name : "NN");
|
||||
|
||||
if(b->asn32s[b->asnumber/65536] &&
|
||||
b->asn32s[b->asnumber/65536][(b->asnumber%65536)/8]&
|
||||
(0x80>>(b->asnumber%8))) {
|
||||
fprintf(f," entry %u expression \"^%u(%u)*$\"\n", lineNo, b->asnumber,
|
||||
b->asnumber);
|
||||
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(k*65536+i*8+j==b->asnumber) continue;
|
||||
if(!nc) {
|
||||
fprintf(f," entry %u expression \"^(.)*(%u",
|
||||
lineNo,k*65536+i*8+j);
|
||||
} else {
|
||||
fprintf(f,"|%u",k*65536+i*8+j);
|
||||
}
|
||||
nc++;
|
||||
if(nc==b->aswidth) {
|
||||
fprintf(f,")$\"\n");
|
||||
nc=0;
|
||||
lineNo++;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
if(nc) fprintf(f,")$\"\n");
|
||||
else if(lineNo==1)
|
||||
fprintf(f," entry 1 expression \"!.*\"\n");
|
||||
fprintf(f,"exit\ncommit\n");
|
||||
return 0;
|
||||
};
|
||||
|
||||
int
|
||||
bgpq3_print_aspath(FILE* f, struct bgpq_expander* b)
|
||||
{
|
||||
@@ -338,6 +429,8 @@ bgpq3_print_aspath(FILE* f, struct bgpq_expander* b)
|
||||
return bgpq3_print_bird_aspath(f,b);
|
||||
} else if(b->vendor==V_OPENBGPD) {
|
||||
return bgpq3_print_openbgpd_aspath(f,b);
|
||||
} else if(b->vendor==V_NOKIA) {
|
||||
return bgpq3_print_nokia_aspath(f,b);
|
||||
} else {
|
||||
sx_report(SX_FATAL,"Unknown vendor %i\n", b->vendor);
|
||||
};
|
||||
@@ -355,6 +448,8 @@ bgpq3_print_oaspath(FILE* f, struct bgpq_expander* b)
|
||||
return bgpq3_print_cisco_xr_oaspath(f,b);
|
||||
} else if(b->vendor==V_OPENBGPD) {
|
||||
return bgpq3_print_openbgpd_oaspath(f,b);
|
||||
} else if(b->vendor==V_NOKIA) {
|
||||
return bgpq3_print_nokia_oaspath(f,b);
|
||||
} else {
|
||||
sx_report(SX_FATAL,"Unknown vendor %i\n", b->vendor);
|
||||
};
|
||||
@@ -689,6 +784,45 @@ checkSon:
|
||||
bgpq3_print_ceacl(n->son,ff);
|
||||
};
|
||||
|
||||
void
|
||||
bgpq3_print_nokia_ipfilter(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));
|
||||
fprintf(f," prefix %s\n", prefix);
|
||||
checkSon:
|
||||
if(n->son)
|
||||
bgpq3_print_nokia_ipfilter(n->son, ff);
|
||||
};
|
||||
|
||||
void
|
||||
bgpq3_print_nokia_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," prefix %s exact\n", prefix);
|
||||
} else {
|
||||
if(n->aggregateLow>n->prefix.masklen) {
|
||||
fprintf(f," prefix %s prefix-length-range %u-%u\n",
|
||||
prefix,n->aggregateLow,n->aggregateHi);
|
||||
} else {
|
||||
fprintf(f," prefix %s prefix-length-range %u-%u\n",
|
||||
prefix, n->prefix.masklen, n->aggregateHi);
|
||||
};
|
||||
};
|
||||
checkSon:
|
||||
if(n->son)
|
||||
bgpq3_print_nokia_prefix(n->son, ff);
|
||||
|
||||
};
|
||||
|
||||
int
|
||||
bgpq3_print_juniper_prefixlist(FILE* f, struct bgpq_expander* b)
|
||||
{
|
||||
@@ -840,6 +974,18 @@ bgpq3_print_format_prefixlist(FILE* f, struct bgpq_expander* b)
|
||||
return 0;
|
||||
};
|
||||
|
||||
int
|
||||
bgpq3_print_nokia_prefixlist(FILE* f, struct bgpq_expander* b)
|
||||
{
|
||||
bname=b->name ? b->name : "NN";
|
||||
fprintf(f,"configure router policy-options\nbegin\nno prefix-list \"%s\"\n",
|
||||
bname);
|
||||
fprintf(f,"prefix-list \"%s\"\n", bname);
|
||||
sx_radix_tree_foreach(b->tree,bgpq3_print_nokia_prefix,f);
|
||||
fprintf(f,"exit\ncommit\n");
|
||||
return 0;
|
||||
};
|
||||
|
||||
int
|
||||
bgpq3_print_cisco_eacl(FILE* f, struct bgpq_expander* b)
|
||||
{
|
||||
@@ -855,6 +1001,22 @@ bgpq3_print_cisco_eacl(FILE* f, struct bgpq_expander* b)
|
||||
return 0;
|
||||
};
|
||||
|
||||
int
|
||||
bgpq3_print_nokia_ipprefixlist(FILE* f, struct bgpq_expander* b)
|
||||
{
|
||||
bname=b->name ? b->name : "NN";
|
||||
fprintf(f,"configure filter match-list\nno %s-prefix-list \"%s\"\n",
|
||||
b->tree->family==AF_INET?"ip":"ipv6", bname);
|
||||
fprintf(f,"%s-prefix-list \"%s\" create\n", b->tree->family==AF_INET?"ip":"ipv6", bname);
|
||||
if (!sx_radix_tree_empty(b->tree)) {
|
||||
sx_radix_tree_foreach(b->tree,bgpq3_print_nokia_ipfilter,f);
|
||||
} else {
|
||||
fprintf(f,"# generated ip-prefix-list %s is empty\n", bname);
|
||||
};
|
||||
fprintf(f,"exit\n");
|
||||
return 0;
|
||||
};
|
||||
|
||||
int
|
||||
bgpq3_print_prefixlist(FILE* f, struct bgpq_expander* b)
|
||||
{
|
||||
@@ -866,6 +1028,7 @@ bgpq3_print_prefixlist(FILE* f, struct bgpq_expander* 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);
|
||||
case V_NOKIA: return bgpq3_print_nokia_prefixlist(f,b);
|
||||
};
|
||||
return 0;
|
||||
};
|
||||
@@ -881,6 +1044,7 @@ bgpq3_print_eacl(FILE* f, struct bgpq_expander* b)
|
||||
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");
|
||||
case V_NOKIA: return bgpq3_print_nokia_ipprefixlist(f,b);
|
||||
};
|
||||
return 0;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user