Add support for Mikrotik

This commit is contained in:
Christian David
2019-12-14 14:48:01 +01:00
committed by Job Snijders
parent 5eaeb69f63
commit 87966dc1f0
6 changed files with 80 additions and 1 deletions

View File

@@ -1,3 +1,8 @@
=======
0.0.2 (2019-12-14):
- Add Mikrotik support
- remove ASDDOT support
0.0.1 (2019-12-14):
- fork bgpq3 into bgpq4

View File

@@ -90,6 +90,10 @@ Generate config for Juniper (default: Cisco).
Generate output in JSON format (default: Cisco).
#### -K
Generate config for MikroTik (default: Cisco).
#### -m `length`
Maximum length of accepted prefixes (default: `32` for IPv4, `128` for IPv6).
@@ -178,6 +182,19 @@ expansion from future expansion.
EXAMPLES
--------
Generating prefix filter for MikroTik for `AS20597`:
user@host:~>./bgpq4 -Kl eltel AS20597
/routing filter add action=accept chain="eltel-V4" prefix=81.9.0.0/20
/routing filter add action=accept chain="eltel-V4" prefix=81.9.32.0/20
/routing filter add action=accept chain="eltel-V4" prefix=81.9.96.0/20
/routing filter add action=accept chain="eltel-V4" prefix=81.222.128.0/20
/routing filter add action=accept chain="eltel-V4" prefix=81.222.160.0/20
/routing filter add action=accept chain="eltel-V4" prefix=81.222.192.0/18
/routing filter add action=accept chain="eltel-V4" prefix=85.249.8.0/21
/routing filter add action=accept chain="eltel-V4" prefix=85.249.224.0/19
/routing filter add action=accept chain="eltel-V4" prefix=89.112.0.0/17
/routing filter add action=accept chain="eltel-V4" prefix=217.170.64.0/19
Generating named Juniper prefix-filter for `AS20597`:

View File

@@ -93,6 +93,8 @@ host running IRRD database (default: rr.ntt.net).
generate config for Juniper (default: Cisco).
.It Fl j
generate output in JSON format (default: Cisco).
.It Fl K
generate config for Mikrotik (default: Cisco).
.It Fl l Ar name
name of generated entry.
.It Fl L Ar limit

View File

@@ -50,6 +50,7 @@ usage(int ecode)
" (use host:port to specify alternate port)\n");
printf(" -J : generate config for JunOS (Cisco IOS by default)\n");
printf(" -j : generate JSON output (Cisco IOS by default)\n");
printf(" -K : generate config for MikroTik RouterOS (Cisco IOS by default)\n");
printf(" -M match : extra match conditions for JunOS route-filters\n");
printf(" -m len : maximum prefix length (default: 32 for IPv4, "
"128 for IPv6)\n");
@@ -145,7 +146,7 @@ main(int argc, char* argv[])
if (getenv("IRRD_SOURCES"))
expander.sources=getenv("IRRD_SOURCES");
while((c=getopt(argc,argv,"2346a:AbBdDEF:S:jJf:l:L:m:M:NnW:Ppr:R:G:tTh:UwXsz"))
while((c=getopt(argc,argv,"2346a:AbBdDEF:S:jJKf:l:L:m:M:NnW:Ppr:R:G:tTh:UwXsz"))
!=EOF) {
switch(c) {
case '2':
@@ -223,6 +224,9 @@ main(int argc, char* argv[])
case 'j': if(expander.vendor) vendor_exclusive();
expander.vendor=V_JSON;
break;
case 'K': if(expander.vendor) vendor_exclusive();
expander.vendor=V_MIKROTIK;
break;
case 'p':
expand_special_asn=1;
break;
@@ -348,6 +352,8 @@ main(int argc, char* argv[])
expander.aswidth=6;
} else if(expander.vendor==V_JUNIPER) {
expander.aswidth=8;
} else if(expander.vendor==V_MIKROTIK) {
expander.aswidth=4;
} else if(expander.vendor==V_BIRD) {
expander.aswidth=10;
} else if(expander.vendor==V_NOKIA || expander.vendor==V_NOKIA_MD) {

View File

@@ -20,6 +20,7 @@ typedef enum {
V_FORMAT,
V_NOKIA,
V_HUAWEI,
V_MIKROTIK,
V_NOKIA_MD
} bgpq_vendor_t;

View File

@@ -1387,6 +1387,52 @@ bgpq4_print_nokia_md_ipprefixlist(FILE* f, struct bgpq_expander* b)
return 0;
};
void
bgpq4_print_kprefix(struct sx_radix_node* n, void* ff)
{
char prefix[128];
FILE* f=(FILE*)ff;
if(!f) f=stdout;
if(n->isGlue) goto checkSon;
sx_prefix_snprintf_sep(&n->prefix,prefix,sizeof(prefix),"/");
if(n->isAggregate) {
if(n->aggregateLow>n->prefix.masklen) {
fprintf(f,"/routing filter add action=accept chain=\"%s-%s\" prefix=%s prefix-length=%d-%d\n",
bname?bname:"NN",
n->prefix.family==AF_INET?"V4":"V6",
prefix,
n->aggregateLow,
n->aggregateHi);
} else {
fprintf(f,"/routing filter add action=accept chain=\"%s-%s\" prefix=%s prefix-length=%d\n",
bname?bname:"NN",
n->prefix.family==AF_INET?"V4":"V6",
prefix,
n->aggregateHi);
};
} else {
fprintf(f,"/routing filter add action=accept chain=\"%s-%s\" prefix=%s\n",
bname?bname:"NN",
n->prefix.family==AF_INET?"V4":"V6",
prefix);
};
checkSon:
if(n->son)
bgpq4_print_kprefix(n->son,ff);
};
int
bgpq4_print_mikrotik_prefixlist(FILE* f, struct bgpq_expander* b)
{
bname=b->name ? b->name : "NN";
if (!sx_radix_tree_empty(b->tree)) {
sx_radix_tree_foreach(b->tree,bgpq4_print_kprefix,f);
} else {
fprintf(f, "# generated prefix-list %s is empty\n", bname);
};
return 0;
};
int
bgpq4_print_prefixlist(FILE* f, struct bgpq_expander* b)
{
@@ -1401,6 +1447,7 @@ bgpq4_print_prefixlist(FILE* f, struct bgpq_expander* b)
case V_NOKIA: return bgpq4_print_nokia_prefixlist(f,b);
case V_NOKIA_MD: return bgpq4_print_nokia_md_ipprefixlist(f,b);
case V_HUAWEI: return bgpq4_print_huawei_prefixlist(f,b);
case V_MIKROTIK: return bgpq4_print_mikrotik_prefixlist(f,b);
};
return 0;
};
@@ -1418,6 +1465,7 @@ bgpq4_print_eacl(FILE* f, struct bgpq_expander* b)
case V_FORMAT: sx_report(SX_FATAL, "unreachable point\n");
case V_NOKIA: return bgpq4_print_nokia_ipprefixlist(f,b);
case V_NOKIA_MD: return bgpq4_print_nokia_md_prefixlist(f,b);
case V_MIKROTIK: return sx_report(SX_FATAL, "unreachable point\n");
case V_HUAWEI: return sx_report(SX_FATAL, "unreachable point\n");
};
return 0;