mirror of
https://github.com/bgp/bgpq4
synced 2025-02-28 08:53:11 +00:00
Merge branch 'style9'
This commit is contained in:
25
README.md
25
README.md
@@ -7,7 +7,7 @@ SYNOPSIS
|
||||
--------
|
||||
|
||||
```
|
||||
bgpq4 [-h host[:port]] [-S sources] [-EPz] [-f asn | -F fmt | -G asn | -t] [-2346ABbDdJjNnpsUX] [-a asn] [-r len] [-R len] [-m max] [-W len] OBJECTS [...] EXCEPT OBJECTS
|
||||
bgpq4 [-h host[:port]] [-S sources] [-Ez] [-f asn | -F fmt | -G asn | -t] [-2346ABbDdJjNnpsUX] [-a asn] [-r len] [-R len] [-m max] [-W len] OBJECTS [...] EXCEPT OBJECTS
|
||||
```
|
||||
|
||||
DESCRIPTION
|
||||
@@ -46,11 +46,11 @@ Specify ASN that shall be denied in case of empty prefix-list (OpenBGPD).
|
||||
|
||||
#### -B
|
||||
|
||||
Generate output in OpenBGPD format (default: Cisco).
|
||||
Generate output in OpenBGPD format.
|
||||
|
||||
#### -b
|
||||
|
||||
Generate output in BIRD format (default: Cisco).
|
||||
Generate output in BIRD format.
|
||||
|
||||
#### -d
|
||||
|
||||
@@ -80,15 +80,15 @@ Host running IRRD database (default: `rr.ntt.net`).
|
||||
|
||||
#### -J
|
||||
|
||||
Generate config for Juniper (default: Cisco).
|
||||
Generate config for Juniper.
|
||||
|
||||
#### -j
|
||||
|
||||
Generate output in JSON format (default: Cisco).
|
||||
Generate output in JSON format.
|
||||
|
||||
#### -K
|
||||
|
||||
Generate config for MikroTik (default: Cisco).
|
||||
Generate config for MikroTik.
|
||||
|
||||
#### -m `length`
|
||||
|
||||
@@ -100,11 +100,11 @@ Extra match conditions for Juniper route-filters. See the examples section.
|
||||
|
||||
#### -n
|
||||
|
||||
Generate config for Nokia SR OS (former Alcatel-Lucent) MD-CLI (default: Cisco)
|
||||
Generate config for Nokia SR OS (former Alcatel-Lucent) MD-CLI.
|
||||
|
||||
#### -N
|
||||
|
||||
Generate config for Nokia SR OS (former Alcatel-Lucent) classic CLI (default: Cisco)
|
||||
Generate config for Nokia SR OS (former Alcatel-Lucent) classic CLI.
|
||||
|
||||
#### -l `name`
|
||||
|
||||
@@ -120,11 +120,6 @@ is a useful feature to prevent generated filters from growing too big.
|
||||
Enable use of private ASNs and ASNs used for documentation purpose only
|
||||
(default: disabled).
|
||||
|
||||
#### -P
|
||||
|
||||
Generate prefix-list (default behaviour, flag added for backward compatibility
|
||||
only).
|
||||
|
||||
#### -r `length`
|
||||
|
||||
Allow more-specific routes with masklen starting with specified length.
|
||||
@@ -152,7 +147,7 @@ Disable pipelining. (not recommended)
|
||||
|
||||
#### -U
|
||||
|
||||
Generate output in Huawei format (default: Cisco).
|
||||
Generate output in Huawei format.
|
||||
|
||||
#### -W `length`
|
||||
|
||||
@@ -160,7 +155,7 @@ Generate as-path strings of a given length maximum (0 for infinity).
|
||||
|
||||
#### -X
|
||||
|
||||
Generate config for Cisco IOS XR devices (plain IOS by default).
|
||||
Generate output in Cisco IOS XR format.
|
||||
|
||||
#### -z
|
||||
|
||||
|
||||
645
bgpq4.c
645
bgpq4.c
@@ -27,42 +27,38 @@ extern int expand_special_asn;
|
||||
int
|
||||
usage(int ecode)
|
||||
{
|
||||
printf("\nUsage: bgpq4 [-h host[:port]] [-S sources] [-P|E|G <num>|f <num>|t]"
|
||||
" [-2346ABbdJjKNnwXz] [-R len] <OBJECTS>...\n");
|
||||
printf("\nUsage: bgpq4 [-h host[:port]] [-S sources] [-P|E|G <num>"
|
||||
"|f <num>|t] [-2346ABbdJjKNnwXz] [-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");
|
||||
printf(" -4 : generate IPv4 prefix-lists (default)\n");
|
||||
printf(" -6 : generate IPv6 prefix-lists (IPv4 by default)\n");
|
||||
printf(" -6 : generate IPv6 prefix-lists\n");
|
||||
printf(" -A : try to aggregate prefix-lists/route-filters\n");
|
||||
printf(" -B : generate OpenBGPD output (Cisco IOS by default)\n");
|
||||
printf(" -b : generate BIRD output (Cisco IOS by default)\n");
|
||||
printf(" -B : generate OpenBGPD output\n");
|
||||
printf(" -b : generate BIRD output\n");
|
||||
printf(" -d : generate some debugging output\n");
|
||||
printf(" -E : generate extended access-list(Cisco), "
|
||||
"route-filter(Juniper)\n"
|
||||
" [ip|ipv6]-prefix-list (Nokia) or prefix-set (OpenBGPD)"
|
||||
"\n");
|
||||
"route-filter(Juniper)\n"
|
||||
" [ip|ipv6]-prefix-list (Nokia) or prefix-set "
|
||||
"(OpenBGPD)\n");
|
||||
printf(" -F fmt : generate output in user-defined format\n");
|
||||
printf(" -f number : generate input as-path access-list\n");
|
||||
printf(" -G number : generate output as-path access-list\n");
|
||||
printf(" -h host : host running IRRD software (rr.ntt.net by "
|
||||
"default)\n"
|
||||
" (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(" -J : generate config for JunOS\n");
|
||||
printf(" -j : generate JSON output\n");
|
||||
printf(" -K : generate config for MikroTik RouterOS\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");
|
||||
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 classic CLI "
|
||||
"(Cisco IOS by default)\n");
|
||||
printf(" -n : generate config for Nokia SR OS MD-CLI (Cisco IOS "
|
||||
"by default)\n");
|
||||
printf(" -P : generate prefix-list (default, just for backward"
|
||||
" compatibility)\n");
|
||||
printf(" -N : generate config for Nokia SR OS classic CLI\n");
|
||||
printf(" -n : generate config for Nokia SR OS MD-CLI\n");
|
||||
printf(" -R len : allow more specific routes up to specified masklen\n");
|
||||
printf(" -r len : allow more specific routes from masklen specified\n");
|
||||
printf(" -S sources: use only specified sources (recommended:"
|
||||
@@ -71,12 +67,12 @@ usage(int ecode)
|
||||
printf(" -T : disable pipelining (experimental, faster mode)\n");
|
||||
printf(" -t : generate as-sets for OpenBGPD (OpenBSD 6.4+), BIRD "
|
||||
"and JSON formats\n");
|
||||
printf(" -U : generate config for Huawei (Cisco IOS by default)\n");
|
||||
printf(" -U : generate config for Huawei\n");
|
||||
printf(" -W len : specify max-entries on as-path line (use 0 for "
|
||||
"infinity)\n");
|
||||
printf(" -w : 'validate' AS numbers: accept only ones with "
|
||||
"registered routes\n");
|
||||
printf(" -X : generate config for IOS XR (Cisco IOS by default)\n");
|
||||
printf(" -X : generate Cisco IOS XR output\n");
|
||||
printf("\n" PACKAGE_NAME " version: " PACKAGE_VERSION "\n");
|
||||
exit(ecode);
|
||||
};
|
||||
@@ -84,17 +80,17 @@ usage(int ecode)
|
||||
void
|
||||
exclusive()
|
||||
{
|
||||
fprintf(stderr,"-E, -f <asnum>, -G <asnum>, -P and -t are mutually "
|
||||
"exclusive\n");
|
||||
fprintf(stderr,"-E, -f <asnum>, -G <asnum>, and -t are mutually "
|
||||
"exclusive\n");
|
||||
exit(1);
|
||||
};
|
||||
|
||||
void
|
||||
vendor_exclusive()
|
||||
{
|
||||
fprintf(stderr, "-b (BIRD), -B (OpenBGPD), -F (formatted), -J (JunOS), "
|
||||
"-j (JSON), -N (Nokia SR OS classic), -n (Nokia SR OS MD-CLI), "
|
||||
"-U (Huawei) and -X (IOS XR) options are mutually exclusive\n");
|
||||
fprintf(stderr, "-b (BIRD), -B (OpenBGPD), -F (formatted), -J (Junos),"
|
||||
" -j (JSON), -N (Nokia SR OS Classic), -n (Nokia SR OS MD-CLI),"
|
||||
" -U (Huawei) and -X (IOS XR) options are mutually exclusive\n");
|
||||
exit(1);
|
||||
};
|
||||
|
||||
@@ -102,30 +98,30 @@ int
|
||||
parseasnumber(struct bgpq_expander* expander, char* optarg)
|
||||
{
|
||||
char* eon=NULL;
|
||||
expander->asnumber=strtoul(optarg,&eon,10);
|
||||
if(expander->asnumber<1 || expander->asnumber>(65535ul*65535)) {
|
||||
expander->asnumber=strtoul(optarg,&eon, 10);
|
||||
if (expander->asnumber < 1 || expander->asnumber > (65535ul * 65535)) {
|
||||
sx_report(SX_FATAL,"Invalid AS number: %s\n", optarg);
|
||||
exit(1);
|
||||
};
|
||||
if(eon && *eon=='.') {
|
||||
if(eon && *eon == '.') {
|
||||
/* -f 3.3, for example */
|
||||
uint32_t loas=strtoul(eon+1,&eon,10);
|
||||
if(expander->asnumber>65535) {
|
||||
uint32_t loas = strtoul(eon+1, &eon, 10);
|
||||
if(expander->asnumber > 65535) {
|
||||
/* should prevent incorrect numbers like 65537.1 */
|
||||
sx_report(SX_FATAL,"Invalid AS number: %s\n", optarg);
|
||||
exit(1);
|
||||
};
|
||||
if(loas<1 || loas>65535) {
|
||||
if(loas < 1 || loas > 65535) {
|
||||
sx_report(SX_FATAL,"Invalid AS number: %s\n", optarg);
|
||||
exit(1);
|
||||
};
|
||||
if(eon && *eon) {
|
||||
sx_report(SX_FATAL,"Invalid symbol in AS number: %c (%s)\n",
|
||||
*eon, optarg);
|
||||
if (eon && *eon) {
|
||||
sx_report(SX_FATAL,"Invalid symbol in AS number: "
|
||||
"%c (%s)\n", *eon, optarg);
|
||||
exit(1);
|
||||
};
|
||||
expander->asnumber=(expander->asnumber<<16)+loas;
|
||||
} else if(eon && *eon) {
|
||||
expander->asnumber=(expander->asnumber << 16) + loas;
|
||||
} else if (eon && *eon) {
|
||||
sx_report(SX_FATAL,"Invalid symbol in AS number: %c (%s)\n",
|
||||
*eon, optarg);
|
||||
exit(1);
|
||||
@@ -138,9 +134,9 @@ main(int argc, char* argv[])
|
||||
{
|
||||
int c;
|
||||
struct bgpq_expander expander;
|
||||
int af=AF_INET, selectedipv4 = 0, exceptmode = 0;
|
||||
int widthSet=0, aggregate=0, refine=0, refineLow=0;
|
||||
unsigned long maxlen=0;
|
||||
int af = AF_INET, selectedipv4 = 0, exceptmode = 0;
|
||||
int widthSet = 0, aggregate = 0, refine = 0, refineLow = 0;
|
||||
unsigned long maxlen = 0;
|
||||
|
||||
#ifdef HAVE_PLEDGE
|
||||
if (pledge("stdio inet dns", NULL) == -1) {
|
||||
@@ -149,286 +145,330 @@ main(int argc, char* argv[])
|
||||
}
|
||||
#endif
|
||||
|
||||
bgpq_expander_init(&expander,af);
|
||||
bgpq_expander_init(&expander, af);
|
||||
|
||||
if (getenv("IRRD_SOURCES"))
|
||||
expander.sources=getenv("IRRD_SOURCES");
|
||||
|
||||
while((c=getopt(argc,argv,"2346a:AbBdDEF:S:jJKf:l:L:m:M:NnW:Ppr:R:G:tTh:UwXsz"))
|
||||
!=EOF) {
|
||||
switch(c) {
|
||||
while ((c = getopt(argc,argv,"2346a:AbBdDEF:S:jJKf:l:L:m:M:NnW:pr:R:G:tTh:UwXsz"))
|
||||
!=EOF) {
|
||||
switch (c) {
|
||||
case '2':
|
||||
expand_as23456=1;
|
||||
expand_as23456 = 1;
|
||||
break;
|
||||
case '3':
|
||||
expander.asn32=1;
|
||||
expander.asn32 = 1;
|
||||
break;
|
||||
case '4':
|
||||
/* do nothing, expander already configured for IPv4 */
|
||||
if (expander.family == AF_INET6) {
|
||||
sx_report(SX_FATAL, "-4 and -6 are mutually exclusive\n");
|
||||
sx_report(SX_FATAL, "-4 and -6 are mutually "
|
||||
"exclusive\n");
|
||||
exit(1);
|
||||
};
|
||||
selectedipv4=1;
|
||||
break;
|
||||
case '6':
|
||||
if (selectedipv4) {
|
||||
sx_report(SX_FATAL, "-4 and -6 are mutually exclusive\n");
|
||||
sx_report(SX_FATAL, "-4 and -6 are mutually "
|
||||
"exclusive\n");
|
||||
exit(1);
|
||||
};
|
||||
af=AF_INET6;
|
||||
expander.family=AF_INET6;
|
||||
expander.tree->family=AF_INET6;
|
||||
af = AF_INET6;
|
||||
expander.family = AF_INET6;
|
||||
expander.tree->family = AF_INET6;
|
||||
break;
|
||||
case 'a':
|
||||
parseasnumber(&expander,optarg);
|
||||
parseasnumber(&expander, optarg);
|
||||
break;
|
||||
case 'A':
|
||||
if(aggregate) debug_aggregation++;
|
||||
aggregate=1;
|
||||
if (aggregate)
|
||||
debug_aggregation++;
|
||||
aggregate = 1;
|
||||
break;
|
||||
case 'b':
|
||||
if(expander.vendor) vendor_exclusive();
|
||||
expander.vendor=V_BIRD;
|
||||
if (expander.vendor)
|
||||
vendor_exclusive();
|
||||
expander.vendor = V_BIRD;
|
||||
break;
|
||||
case 'B':
|
||||
if(expander.vendor) vendor_exclusive();
|
||||
expander.vendor=V_OPENBGPD;
|
||||
expander.asn32=1;
|
||||
if (expander.vendor)
|
||||
vendor_exclusive();
|
||||
expander.vendor = V_OPENBGPD;
|
||||
expander.asn32 = 1;
|
||||
break;
|
||||
case 'd': debug_expander++;
|
||||
case 'd':
|
||||
debug_expander++;
|
||||
break;
|
||||
case 'E': if(expander.generation) exclusive();
|
||||
expander.generation=T_EACL;
|
||||
case 'E':
|
||||
if (expander.generation)
|
||||
exclusive();
|
||||
expander.generation = T_EACL;
|
||||
break;
|
||||
case 'F': if(expander.vendor) exclusive();
|
||||
expander.vendor=V_FORMAT;
|
||||
expander.format=optarg;
|
||||
case 'F':
|
||||
if (expander.vendor)
|
||||
exclusive();
|
||||
expander.vendor = V_FORMAT;
|
||||
expander.format = optarg;
|
||||
break;
|
||||
case 'f':
|
||||
if(expander.generation) exclusive();
|
||||
expander.generation=T_ASPATH;
|
||||
parseasnumber(&expander,optarg);
|
||||
if (expander.generation)
|
||||
exclusive();
|
||||
expander.generation = T_ASPATH;
|
||||
parseasnumber(&expander, optarg);
|
||||
break;
|
||||
case 'G':
|
||||
if(expander.generation) exclusive();
|
||||
expander.generation=T_OASPATH;
|
||||
parseasnumber(&expander,optarg);
|
||||
if (expander.generation)
|
||||
exclusive();
|
||||
expander.generation = T_OASPATH;
|
||||
parseasnumber(&expander, optarg);
|
||||
break;
|
||||
case 'h': {
|
||||
char* d=strchr(optarg, ':');
|
||||
expander.server=optarg;
|
||||
if(d) {
|
||||
*d=0;
|
||||
expander.port=d+1;
|
||||
case 'h':
|
||||
{
|
||||
char* d = strchr(optarg, ':');
|
||||
expander.server = optarg;
|
||||
if (d) {
|
||||
*d = 0;
|
||||
expander.port = d + 1;
|
||||
};
|
||||
};
|
||||
break;
|
||||
};
|
||||
case 'J': if(expander.vendor) vendor_exclusive();
|
||||
expander.vendor=V_JUNIPER;
|
||||
case 'J':
|
||||
if (expander.vendor)
|
||||
vendor_exclusive();
|
||||
expander.vendor = V_JUNIPER;
|
||||
break;
|
||||
case 'j': if(expander.vendor) vendor_exclusive();
|
||||
expander.vendor=V_JSON;
|
||||
case 'j':
|
||||
if (expander.vendor)
|
||||
vendor_exclusive();
|
||||
expander.vendor = V_JSON;
|
||||
break;
|
||||
case 'K': if(expander.vendor) vendor_exclusive();
|
||||
expander.vendor=V_MIKROTIK;
|
||||
case 'K':
|
||||
if (expander.vendor)
|
||||
vendor_exclusive();
|
||||
expander.vendor = V_MIKROTIK;
|
||||
break;
|
||||
case 'p':
|
||||
expand_special_asn=1;
|
||||
break;
|
||||
case 'P':
|
||||
if(expander.generation) exclusive();
|
||||
expander.generation=T_PREFIXLIST;
|
||||
expand_special_asn = 1;
|
||||
break;
|
||||
case 'r':
|
||||
refineLow=strtoul(optarg,NULL,10);
|
||||
if(!refineLow) {
|
||||
sx_report(SX_FATAL,"Invalid refineLow value: %s\n", optarg);
|
||||
refineLow = strtoul(optarg, NULL, 10);
|
||||
if (!refineLow) {
|
||||
sx_report(SX_FATAL, "Invalid refineLow value:"
|
||||
" %s\n", optarg);
|
||||
exit(1);
|
||||
};
|
||||
break;
|
||||
case 'R':
|
||||
refine=strtoul(optarg,NULL,10);
|
||||
if(!refine) {
|
||||
sx_report(SX_FATAL,"Invalid refine length: %s\n", optarg);
|
||||
refine = strtoul(optarg, NULL, 10);
|
||||
if (!refine) {
|
||||
sx_report(SX_FATAL,"Invalid refine length:"
|
||||
" %s\n", optarg);
|
||||
exit(1);
|
||||
};
|
||||
break;
|
||||
case 'l': expander.name=optarg;
|
||||
case 'l':
|
||||
expander.name = optarg;
|
||||
break;
|
||||
case 'L': expander.maxdepth=strtol(optarg, NULL, 10);
|
||||
case 'L':
|
||||
expander.maxdepth = strtol(optarg, NULL, 10);
|
||||
if (expander.maxdepth < 1) {
|
||||
sx_report(SX_FATAL, "Invalid maximum recursion (-L): %s\n",
|
||||
optarg);
|
||||
sx_report(SX_FATAL, "Invalid maximum recursion"
|
||||
" (-L): %s\n", optarg);
|
||||
exit(1);
|
||||
};
|
||||
break;
|
||||
case 'm': maxlen=strtoul(optarg, NULL, 10);
|
||||
case 'm':
|
||||
maxlen=strtoul(optarg, NULL, 10);
|
||||
if (!maxlen) {
|
||||
sx_report(SX_FATAL, "Invalid maxlen (-m): %s\n", optarg);
|
||||
sx_report(SX_FATAL, "Invalid maxlen (-m): %s\n",
|
||||
optarg);
|
||||
exit(1);
|
||||
};
|
||||
break;
|
||||
case 'M': {
|
||||
case 'M':
|
||||
{
|
||||
char* c, *d;
|
||||
expander.match=strdup(optarg);
|
||||
c=d=expander.match;
|
||||
while(*c) {
|
||||
if(*c=='\\') {
|
||||
if(*(c+1)=='n') {
|
||||
*d='\n';
|
||||
expander.match = strdup(optarg);
|
||||
c = d = expander.match;
|
||||
while (*c) {
|
||||
if (*c == '\\') {
|
||||
if (*(c+1) == '\n') {
|
||||
*d = '\n';
|
||||
d++;
|
||||
c+=2;
|
||||
} else if(*(c+1)=='r') {
|
||||
*d='\r';
|
||||
c += 2;
|
||||
} else if (*(c + 1) == 'r') {
|
||||
*d = '\r';
|
||||
d++;
|
||||
c+=2;
|
||||
} else if(*(c+1)=='t') {
|
||||
*d='\t';
|
||||
c += 2;
|
||||
} else if (*(c + 1) == 't') {
|
||||
*d = '\t';
|
||||
d++;
|
||||
c+=2;
|
||||
} else if(*(c+1)=='\\') {
|
||||
*d='\\';
|
||||
c += 2;
|
||||
} else if (*(c + 1) == '\\') {
|
||||
*d = '\\';
|
||||
d++;
|
||||
c+=2;
|
||||
c += 2;
|
||||
} else {
|
||||
sx_report(SX_FATAL, "Unsupported escape \%c (0x%2.2x) "
|
||||
"in '%s'\n", isprint(*c)?*c:20, *c, optarg);
|
||||
sx_report(SX_FATAL, "Unsupported"
|
||||
" escape \%c (0x%2.2x) in "
|
||||
"'%s'\n",
|
||||
isprint(*c) ? *c : 20,
|
||||
*c, optarg);
|
||||
exit(1);
|
||||
};
|
||||
} else {
|
||||
if(c!=d) {
|
||||
*d=*c;
|
||||
if (c != d) {
|
||||
*d = *c;
|
||||
};
|
||||
d++;
|
||||
c++;
|
||||
};
|
||||
};
|
||||
*d=0;
|
||||
*d = 0;
|
||||
};
|
||||
break;
|
||||
case 'N': if(expander.vendor) vendor_exclusive();
|
||||
expander.vendor=V_NOKIA;
|
||||
case 'N':
|
||||
if (expander.vendor)
|
||||
vendor_exclusive();
|
||||
expander.vendor = V_NOKIA;
|
||||
break;
|
||||
case 'n': if(expander.vendor) vendor_exclusive();
|
||||
expander.vendor=V_NOKIA_MD;
|
||||
case 'n':
|
||||
if (expander.vendor)
|
||||
vendor_exclusive();
|
||||
expander.vendor = V_NOKIA_MD;
|
||||
break;
|
||||
case 't':
|
||||
if(expander.generation) exclusive();
|
||||
expander.generation=T_ASSET;
|
||||
if (expander.generation)
|
||||
exclusive();
|
||||
expander.generation = T_ASSET;
|
||||
break;
|
||||
case 'T': pipelining=0;
|
||||
case 'T':
|
||||
pipelining = 0;
|
||||
break;
|
||||
case 's': expander.sequence=1;
|
||||
case 's':
|
||||
expander.sequence = 1;
|
||||
break;
|
||||
case 'S': expander.sources=optarg;
|
||||
case 'S':
|
||||
expander.sources = optarg;
|
||||
break;
|
||||
case 'U':
|
||||
if(expander.vendor) exclusive();
|
||||
expander.vendor=V_HUAWEI;
|
||||
if (expander.vendor)
|
||||
exclusive();
|
||||
expander.vendor = V_HUAWEI;
|
||||
break;
|
||||
case 'W': expander.aswidth=atoi(optarg);
|
||||
if(expander.aswidth<0) {
|
||||
sx_report(SX_FATAL,"Invalid as-width: %s\n", optarg);
|
||||
case 'W':
|
||||
expander.aswidth = atoi(optarg);
|
||||
if (expander.aswidth < 0) {
|
||||
sx_report(SX_FATAL,"Invalid as-width: %s\n",
|
||||
optarg);
|
||||
exit(1);
|
||||
};
|
||||
widthSet=1;
|
||||
widthSet = 1;
|
||||
break;
|
||||
case 'w': expander.validate_asns=1;
|
||||
case 'w':
|
||||
expander.validate_asns = 1;
|
||||
break;
|
||||
case 'X': if(expander.vendor) vendor_exclusive();
|
||||
expander.vendor=V_CISCO_XR;
|
||||
case 'X':
|
||||
if (expander.vendor)
|
||||
vendor_exclusive();
|
||||
expander.vendor = V_CISCO_XR;
|
||||
break;
|
||||
case 'z':
|
||||
if(expander.generation) exclusive();
|
||||
expander.generation=T_ROUTE_FILTER_LIST;
|
||||
if (expander.generation)
|
||||
exclusive();
|
||||
expander.generation = T_ROUTE_FILTER_LIST;
|
||||
break;
|
||||
default : usage(1);
|
||||
default:
|
||||
usage(1);
|
||||
};
|
||||
};
|
||||
|
||||
argc-=optind;
|
||||
argv+=optind;
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if(!widthSet) {
|
||||
if(expander.generation==T_ASPATH) {
|
||||
if(expander.vendor==V_CISCO) {
|
||||
expander.aswidth=4;
|
||||
} else if(expander.vendor==V_CISCO_XR) {
|
||||
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) {
|
||||
expander.aswidth=8;
|
||||
if (!widthSet) {
|
||||
if (expander.generation==T_ASPATH) {
|
||||
if (expander.vendor == V_CISCO) {
|
||||
expander.aswidth = 4;
|
||||
} else if (expander.vendor == V_CISCO_XR) {
|
||||
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) {
|
||||
expander.aswidth = 8;
|
||||
};
|
||||
} else if(expander.generation==T_OASPATH) {
|
||||
if(expander.vendor==V_CISCO) {
|
||||
expander.aswidth=5;
|
||||
} else if(expander.vendor==V_CISCO_XR) {
|
||||
expander.aswidth=7;
|
||||
} else if(expander.vendor==V_JUNIPER) {
|
||||
expander.aswidth=8;
|
||||
} else if(expander.vendor==V_NOKIA || expander.vendor==V_NOKIA_MD) {
|
||||
expander.aswidth=8;
|
||||
} else if (expander.generation == T_OASPATH) {
|
||||
if (expander.vendor == V_CISCO) {
|
||||
expander.aswidth = 5;
|
||||
} else if (expander.vendor == V_CISCO_XR) {
|
||||
expander.aswidth = 7;
|
||||
} else if (expander.vendor==V_JUNIPER) {
|
||||
expander.aswidth = 8;
|
||||
} else if (expander.vendor == V_NOKIA ||
|
||||
expander.vendor == V_NOKIA_MD) {
|
||||
expander.aswidth = 8;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
if(!expander.generation) {
|
||||
expander.generation=T_PREFIXLIST;
|
||||
if (!expander.generation) {
|
||||
expander.generation = T_PREFIXLIST;
|
||||
};
|
||||
|
||||
if(expander.vendor==V_CISCO_XR && expander.generation!=T_PREFIXLIST &&
|
||||
expander.generation!=T_ASPATH && expander.generation!=T_OASPATH) {
|
||||
if (expander.generation != (T_PREFIXLIST & T_ASPATH & T_OASPATH) &&
|
||||
expander.vendor == V_CISCO_XR) {
|
||||
sx_report(SX_FATAL, "Sorry, only prefix-sets and as-paths "
|
||||
"supported for IOS XR\n");
|
||||
};
|
||||
if(expander.vendor==V_BIRD && expander.generation!=T_PREFIXLIST &&
|
||||
expander.generation!=T_ASPATH && expander.generation!=T_ASSET) {
|
||||
if (expander.vendor == V_BIRD && expander.generation != T_PREFIXLIST &&
|
||||
expander.generation != T_ASPATH && expander.generation != T_ASSET) {
|
||||
sx_report(SX_FATAL, "Sorry, only prefix-lists and as-paths/as-sets "
|
||||
"supported for BIRD output\n");
|
||||
"supported for BIRD output\n");
|
||||
};
|
||||
if(expander.vendor==V_JSON && expander.generation!=T_PREFIXLIST &&
|
||||
expander.generation!=T_ASPATH && expander.generation!=T_ASSET) {
|
||||
if (expander.vendor == V_JSON && expander.generation != T_PREFIXLIST &&
|
||||
expander.generation != T_ASPATH && expander.generation != T_ASSET) {
|
||||
sx_report(SX_FATAL, "Sorry, only prefix-lists and as-paths/as-sets "
|
||||
"supported for JSON output\n");
|
||||
"supported for JSON output\n");
|
||||
};
|
||||
if(expander.vendor==V_FORMAT && expander.generation!=T_PREFIXLIST)
|
||||
|
||||
if (expander.vendor == V_FORMAT && expander.generation != T_PREFIXLIST)
|
||||
sx_report(SX_FATAL, "Sorry, only prefix-lists supported in formatted "
|
||||
"output\n");
|
||||
if(expander.vendor==V_FORMAT && (refine || refineLow)) {
|
||||
"output\n");
|
||||
|
||||
if (expander.vendor == V_FORMAT && (refine || refineLow)) {
|
||||
sx_report(SX_FATAL, "Sorry, formatted output (-F <fmt>) in not "
|
||||
"compatible with -R/-r options\n");
|
||||
"compatible with -R/-r options\n");
|
||||
exit(1);
|
||||
};
|
||||
if(expander.vendor==V_HUAWEI && expander.generation!=T_ASPATH &&
|
||||
expander.generation!=T_OASPATH && expander.generation != T_PREFIXLIST)
|
||||
|
||||
if (expander.vendor == V_HUAWEI && expander.generation != T_ASPATH &&
|
||||
expander.generation != T_OASPATH && expander.generation != T_PREFIXLIST)
|
||||
sx_report(SX_FATAL, "Sorry, only as-paths and prefix-lists supported "
|
||||
"for Huawei output\n");
|
||||
"for Huawei output\n");
|
||||
|
||||
if(expander.generation==T_ROUTE_FILTER_LIST && expander.vendor!=V_JUNIPER) {
|
||||
if (expander.generation == T_ROUTE_FILTER_LIST && expander.vendor != V_JUNIPER)
|
||||
sx_report(SX_FATAL, "Route-filter-lists (-z) supported for Juniper (-J)"
|
||||
" output only\n");
|
||||
};
|
||||
if(expander.generation==T_ASSET && expander.vendor!=V_JSON &&
|
||||
expander.vendor!=V_OPENBGPD && expander.vendor!=V_BIRD) {
|
||||
" output only\n");
|
||||
|
||||
if (expander.generation == T_ASSET && expander.vendor != V_JSON &&
|
||||
expander.vendor != V_OPENBGPD && expander.vendor != V_BIRD)
|
||||
sx_report(SX_FATAL, "As-Sets (-t) supported for JSON (-j), OpenBGPD "
|
||||
"(-B) and BIRD (-b) output only\n");
|
||||
};
|
||||
"(-B) and BIRD (-b) output only\n");
|
||||
|
||||
if(!expander.asn32 && expander.asnumber>65535) {
|
||||
expander.asnumber=23456;
|
||||
};
|
||||
if (!expander.asn32 && expander.asnumber > 65535)
|
||||
expander.asnumber = 23456;
|
||||
|
||||
if(aggregate && expander.vendor==V_JUNIPER &&
|
||||
expander.generation==T_PREFIXLIST) {
|
||||
if (aggregate && expander.vendor == V_JUNIPER && expander.generation == T_PREFIXLIST) {
|
||||
sx_report(SX_FATAL, "Sorry, aggregation (-A) does not work in"
|
||||
" Juniper prefix-lists\nYou can try route-filters (-E) "
|
||||
"or route-filter-lists (-z) instead of prefix-lists "
|
||||
"(-P, default)\n");
|
||||
" Juniper prefix-lists\nYou can try route-filters (-E) "
|
||||
"or route-filter-lists (-z) instead of prefix-lists "
|
||||
"(-P, default)\n");
|
||||
exit(1);
|
||||
};
|
||||
|
||||
@@ -438,48 +478,50 @@ main(int argc, char* argv[])
|
||||
exit(1);
|
||||
};
|
||||
|
||||
if(aggregate && (expander.vendor==V_NOKIA_MD || expander.vendor==V_NOKIA) &&
|
||||
expander.generation!=T_PREFIXLIST) {
|
||||
if (aggregate && (expander.vendor == V_NOKIA_MD || expander.vendor == V_NOKIA) &&
|
||||
expander.generation != T_PREFIXLIST) {
|
||||
sx_report(SX_FATAL, "Sorry, aggregation (-A) is not supported with "
|
||||
"ip-prefix-lists (-E) on Nokia. You can try prefix-lists (-P) "
|
||||
"instead\n");
|
||||
"ip-prefix-lists (-E) on Nokia. You can try prefix-lists (-P) "
|
||||
"instead\n");
|
||||
exit(1);
|
||||
};
|
||||
if(refine && (expander.vendor==V_NOKIA_MD || expander.vendor==V_NOKIA) &&
|
||||
expander.generation!=T_PREFIXLIST) {
|
||||
|
||||
if (refine && (expander.vendor == V_NOKIA_MD || expander.vendor == V_NOKIA) &&
|
||||
expander.generation != T_PREFIXLIST) {
|
||||
sx_report(SX_FATAL, "Sorry, more-specifics (-R) is not supported with "
|
||||
"ip-prefix-lists (-E) on Nokia. You can try prefix-lists (-P) "
|
||||
"instead\n");
|
||||
"ip-prefix-lists (-E) on Nokia. You can try prefix-lists (-P) "
|
||||
"instead\n");
|
||||
exit(1);
|
||||
};
|
||||
if(refineLow && (expander.vendor==V_NOKIA_MD || expander.vendor==V_NOKIA) &&
|
||||
expander.generation!=T_PREFIXLIST) {
|
||||
|
||||
if (refineLow && (expander.vendor == V_NOKIA_MD || expander.vendor == V_NOKIA) &&
|
||||
expander.generation != T_PREFIXLIST) {
|
||||
sx_report(SX_FATAL, "Sorry, more-specifics (-r) is not supported with "
|
||||
"ip-prefix-lists (-E) on Nokia. You can try prefix-lists (-P) "
|
||||
"instead\n");
|
||||
"ip-prefix-lists (-E) on Nokia. You can try prefix-lists (-P) "
|
||||
"instead\n");
|
||||
exit(1);
|
||||
};
|
||||
|
||||
if(aggregate && expander.generation<T_PREFIXLIST) {
|
||||
if (aggregate && expander.generation < T_PREFIXLIST) {
|
||||
sx_report(SX_FATAL, "Sorry, aggregation (-A) used only for prefix-"
|
||||
"lists, extended access-lists and route-filters\n");
|
||||
"lists, extended access-lists and route-filters\n");
|
||||
exit(1);
|
||||
};
|
||||
|
||||
if (expander.sequence && expander.vendor!=V_CISCO) {
|
||||
if (expander.sequence && expander.vendor != V_CISCO) {
|
||||
sx_report(SX_FATAL, "Sorry, prefix-lists sequencing (-s) supported"
|
||||
" only for IOS\n");
|
||||
" only for IOS\n");
|
||||
exit(1);
|
||||
};
|
||||
|
||||
if (expander.sequence && expander.generation<T_PREFIXLIST) {
|
||||
if (expander.sequence && expander.generation < T_PREFIXLIST) {
|
||||
sx_report(SX_FATAL, "Sorry, prefix-lists sequencing (-s) can't be "
|
||||
" used for non prefix-list\n");
|
||||
" used for non prefix-list\n");
|
||||
exit(1);
|
||||
};
|
||||
|
||||
if(refineLow && !refine) {
|
||||
if(expander.family == AF_INET)
|
||||
if (refineLow && !refine) {
|
||||
if (expander.family == AF_INET)
|
||||
refine = 32;
|
||||
else
|
||||
refine = 128;
|
||||
@@ -487,126 +529,129 @@ main(int argc, char* argv[])
|
||||
|
||||
if (refineLow && refineLow > refine) {
|
||||
sx_report(SX_FATAL, "Incompatible values for -r %u and -R %u\n",
|
||||
refineLow, refine);
|
||||
refineLow, refine);
|
||||
};
|
||||
|
||||
if(refine || refineLow) {
|
||||
if(expander.family==AF_INET6 && refine>128) {
|
||||
if (refine || refineLow) {
|
||||
if (expander.family == AF_INET6 && refine > 128) {
|
||||
sx_report(SX_FATAL, "Invalid value for refine(-R): %u (1-128 for"
|
||||
" IPv6)\n", refine);
|
||||
} else if(expander.family==AF_INET6 && refineLow>128) {
|
||||
" IPv6)\n", refine);
|
||||
} else if (expander.family == AF_INET6 && refineLow > 128) {
|
||||
sx_report(SX_FATAL, "Invalid value for refineLow(-r): %u (1-128 for"
|
||||
" IPv6)\n", refineLow);
|
||||
} else if(expander.family==AF_INET && refine>32) {
|
||||
" IPv6)\n", refineLow);
|
||||
} else if (expander.family == AF_INET && refine > 32) {
|
||||
sx_report(SX_FATAL, "Invalid value for refine(-R): %u (1-32 for"
|
||||
" IPv4)\n", refine);
|
||||
} else if(expander.family==AF_INET && refineLow>32) {
|
||||
" IPv4)\n", refine);
|
||||
} else if (expander.family == AF_INET && refineLow > 32) {
|
||||
sx_report(SX_FATAL, "Invalid value for refineLow(-r): %u (1-32 for"
|
||||
" IPv4)\n", refineLow);
|
||||
" IPv4)\n", refineLow);
|
||||
};
|
||||
|
||||
if(expander.vendor==V_JUNIPER && expander.generation==T_PREFIXLIST) {
|
||||
if(refine) {
|
||||
if (expander.vendor == V_JUNIPER && expander.generation == T_PREFIXLIST) {
|
||||
if (refine) {
|
||||
sx_report(SX_FATAL, "Sorry, more-specific filters (-R %u) "
|
||||
"is not supported for Juniper prefix-lists.\n"
|
||||
"Use router-filters (-E) or route-filter-lists (-z) "
|
||||
"instead\n", refine);
|
||||
"is not supported for Juniper prefix-lists.\n"
|
||||
"Use router-filters (-E) or route-filter-lists (-z) "
|
||||
"instead\n", refine);
|
||||
} else {
|
||||
sx_report(SX_FATAL, "Sorry, more-specific filters (-r %u) "
|
||||
"is not supported for Juniper prefix-lists.\n"
|
||||
"Use route-filters (-E) or route-filter-lists (-z) "
|
||||
"instead\n", refineLow);
|
||||
"is not supported for Juniper prefix-lists.\n"
|
||||
"Use route-filters (-E) or route-filter-lists (-z) "
|
||||
"instead\n", refineLow);
|
||||
};
|
||||
};
|
||||
|
||||
if(expander.generation<T_PREFIXLIST) {
|
||||
if(refine) {
|
||||
if (expander.generation < T_PREFIXLIST) {
|
||||
if (refine) {
|
||||
sx_report(SX_FATAL, "Sorry, more-specific filter (-R %u) "
|
||||
"supported only with prefix-list generation\n", refine);
|
||||
"supported only with prefix-list generation\n", refine);
|
||||
} else {
|
||||
sx_report(SX_FATAL, "Sorry, more-specific filter (-r %u) "
|
||||
"supported only with prefix-list generation\n", refineLow);
|
||||
"supported only with prefix-list generation\n", refineLow);
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
if(maxlen) {
|
||||
if((expander.family==AF_INET6 && maxlen>128) ||
|
||||
(expander.family==AF_INET && maxlen>32)) {
|
||||
if (maxlen) {
|
||||
if ((expander.family == AF_INET6 && maxlen > 128)
|
||||
|| (expander.family == AF_INET && maxlen > 32)) {
|
||||
sx_report(SX_FATAL, "Invalid value for max-prefixlen: %lu (1-128 "
|
||||
"for IPv6, 1-32 for IPv4)\n", maxlen);
|
||||
"for IPv6, 1-32 for IPv4)\n", maxlen);
|
||||
exit(1);
|
||||
} else if((expander.family==AF_INET6 && maxlen<128) ||
|
||||
(expander.family==AF_INET && maxlen<32)) {
|
||||
/* inet6/128 and inet4/32 does not make sense - all routes will
|
||||
* be accepted, so save some CPU cycles :) */
|
||||
} else if ((expander.family == AF_INET6 && maxlen < 128)
|
||||
|| (expander.family == AF_INET && maxlen < 32)) {
|
||||
/*
|
||||
* inet6/128 and inet4/32 does not make sense - all
|
||||
* routes will be accepted, so save some CPU cycles :)
|
||||
*/
|
||||
expander.maxlen = maxlen;
|
||||
};
|
||||
} else if (expander.family==AF_INET) {
|
||||
} else if (expander.family == AF_INET) {
|
||||
expander.maxlen = 32;
|
||||
} else if (expander.family==AF_INET6) {
|
||||
} else if (expander.family == AF_INET6) {
|
||||
expander.maxlen = 128;
|
||||
};
|
||||
|
||||
if(expander.generation==T_EACL && expander.vendor==V_CISCO &&
|
||||
expander.family==AF_INET6) {
|
||||
sx_report(SX_FATAL,"Sorry, ipv6 access-lists not supported for Cisco"
|
||||
" yet.\n");
|
||||
if (expander.generation == T_EACL && expander.vendor == V_CISCO
|
||||
&& expander.family == AF_INET6) {
|
||||
sx_report(SX_FATAL,"Sorry, ipv6 access-lists not supported "
|
||||
"for Cisco yet.\n");
|
||||
};
|
||||
|
||||
if(expander.match != NULL && (expander.vendor != V_JUNIPER ||
|
||||
expander.generation != T_EACL)) {
|
||||
if (expander.match != NULL
|
||||
&& (expander.vendor != V_JUNIPER || expander.generation != T_EACL)) {
|
||||
sx_report(SX_FATAL, "Sorry, extra match conditions (-M) can be used "
|
||||
"only with Juniper route-filters\n");
|
||||
"only with Juniper route-filters\n");
|
||||
};
|
||||
|
||||
if((expander.generation==T_ASPATH || expander.generation==T_OASPATH) &&
|
||||
af != AF_INET && !expander.validate_asns) {
|
||||
if ((expander.generation == T_ASPATH || expander.generation == T_OASPATH)
|
||||
&& af != AF_INET && !expander.validate_asns) {
|
||||
sx_report(SX_FATAL, "Sorry, -6 makes no sense with as-path (-f/-G) "
|
||||
"generation\n");
|
||||
"generation\n");
|
||||
};
|
||||
|
||||
if (expander.validate_asns && expander.generation != T_ASPATH &&
|
||||
expander.generation != T_OASPATH) {
|
||||
sx_report(SX_FATAL, "Sorry, -w makes sense only for as-path (-f/-G) "
|
||||
"generation\n");
|
||||
if (expander.validate_asns && expander.generation != T_ASPATH
|
||||
&& expander.generation != T_OASPATH) {
|
||||
sx_report(SX_FATAL, "Sorry, -w makes sense only for as-path "
|
||||
"(-f/-G) generation\n");
|
||||
};
|
||||
|
||||
if(!argv[0])
|
||||
if (!argv[0])
|
||||
usage(1);
|
||||
|
||||
while(argv[0]) {
|
||||
if(!strcmp(argv[0], "EXCEPT")) {
|
||||
while (argv[0]) {
|
||||
if (!strcmp(argv[0], "EXCEPT")) {
|
||||
exceptmode = 1;
|
||||
} else if (exceptmode) {
|
||||
bgpq_expander_add_stop(&expander,argv[0]);
|
||||
} else if(!strncasecmp(argv[0],"AS-",3)) {
|
||||
} else if (!strncasecmp(argv[0], "AS-", 3)) {
|
||||
bgpq_expander_add_asset(&expander,argv[0]);
|
||||
} else if(!strncasecmp(argv[0],"RS-",3)) {
|
||||
} else if (!strncasecmp(argv[0], "RS-", 3)) {
|
||||
bgpq_expander_add_rset(&expander,argv[0]);
|
||||
} else if(!strncasecmp(argv[0],"AS",2)) {
|
||||
} else if (!strncasecmp(argv[0], "AS", 2)) {
|
||||
char* c;
|
||||
if((c=strchr(argv[0],':'))) {
|
||||
if(!strncasecmp(c+1,"AS-",3)) {
|
||||
bgpq_expander_add_asset(&expander,argv[0]);
|
||||
} else if(!strncasecmp(c+1,"RS-",3)) {
|
||||
bgpq_expander_add_rset(&expander,argv[0]);
|
||||
if ((c = strchr(argv[0], ':'))) {
|
||||
if (!strncasecmp(c + 1, "AS-", 3)) {
|
||||
bgpq_expander_add_asset(&expander, argv[0]);
|
||||
} else if (!strncasecmp(c + 1, "RS-", 3)) {
|
||||
bgpq_expander_add_rset(&expander, argv[0]);
|
||||
} else {
|
||||
SX_DEBUG(debug_expander,"Unknown sub-as object %s\n",
|
||||
argv[0]);
|
||||
SX_DEBUG(debug_expander,"Unknown sub-as"
|
||||
" object %s\n", argv[0]);
|
||||
};
|
||||
} else {
|
||||
bgpq_expander_add_as(&expander,argv[0]);
|
||||
};
|
||||
} else {
|
||||
char* c = strchr(argv[0], '^');
|
||||
if (!c && !bgpq_expander_add_prefix(&expander,argv[0])) {
|
||||
sx_report(SX_ERROR, "Unable to add prefix %s (bad prefix or "
|
||||
"address-family)\n", argv[0]);
|
||||
if (!c && !bgpq_expander_add_prefix(&expander, argv[0])) {
|
||||
sx_report(SX_ERROR, "Unable to add prefix %s "
|
||||
"(bad prefix or address-family)\n", argv[0]);
|
||||
exit(1);
|
||||
} else if (c && !bgpq_expander_add_prefix_range(&expander,argv[0])){
|
||||
sx_report(SX_ERROR, "Unable to add prefix-range %s (bad range "
|
||||
"or address-family)\n", argv[0]);
|
||||
} else if (c && !bgpq_expander_add_prefix_range(&expander, argv[0])){
|
||||
sx_report(SX_ERROR, "Unable to add prefix-range "
|
||||
"%s (bad range or address-family)\n",
|
||||
argv[0]);
|
||||
exit(1);
|
||||
};
|
||||
};
|
||||
@@ -614,31 +659,36 @@ main(int argc, char* argv[])
|
||||
argc--;
|
||||
};
|
||||
|
||||
if(!bgpq_expand(&expander)) {
|
||||
if (!bgpq_expand(&expander))
|
||||
exit(1);
|
||||
};
|
||||
|
||||
if(refine)
|
||||
sx_radix_tree_refine(expander.tree,refine);
|
||||
if (refine)
|
||||
sx_radix_tree_refine(expander.tree, refine);
|
||||
|
||||
if(refineLow)
|
||||
if (refineLow)
|
||||
sx_radix_tree_refineLow(expander.tree, refineLow);
|
||||
|
||||
if(aggregate)
|
||||
if (aggregate)
|
||||
sx_radix_tree_aggregate(expander.tree);
|
||||
|
||||
switch(expander.generation) {
|
||||
case T_NONE: sx_report(SX_FATAL,"Unreachable point... call snar\n");
|
||||
switch (expander.generation) {
|
||||
case T_NONE:
|
||||
sx_report(SX_FATAL,"Unreachable point... call snar\n");
|
||||
exit(1);
|
||||
case T_ASPATH: bgpq4_print_aspath(stdout,&expander);
|
||||
case T_ASPATH:
|
||||
bgpq4_print_aspath(stdout,&expander);
|
||||
break;
|
||||
case T_OASPATH: bgpq4_print_oaspath(stdout,&expander);
|
||||
case T_OASPATH:
|
||||
bgpq4_print_oaspath(stdout,&expander);
|
||||
break;
|
||||
case T_ASSET: bgpq4_print_asset(stdout,&expander);
|
||||
case T_ASSET:
|
||||
bgpq4_print_asset(stdout,&expander);
|
||||
break;
|
||||
case T_PREFIXLIST: bgpq4_print_prefixlist(stdout,&expander);
|
||||
case T_PREFIXLIST:
|
||||
bgpq4_print_prefixlist(stdout,&expander);
|
||||
break;
|
||||
case T_EACL: bgpq4_print_eacl(stdout,&expander);
|
||||
case T_EACL:
|
||||
bgpq4_print_eacl(stdout,&expander);
|
||||
break;
|
||||
case T_ROUTE_FILTER_LIST:
|
||||
bgpq4_print_route_filter_list(stdout, &expander);
|
||||
@@ -649,4 +699,3 @@ main(int argc, char* argv[])
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
|
||||
1826
bgpq4_printer.c
1826
bgpq4_printer.c
File diff suppressed because it is too large
Load Diff
748
bgpq_expander.c
748
bgpq_expander.c
File diff suppressed because it is too large
Load Diff
@@ -1,78 +1,83 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
#include <bgpq4.h>
|
||||
|
||||
void sx_radix_node_freeall(struct sx_radix_node *n) {
|
||||
if (n->l != NULL) {
|
||||
sx_radix_node_freeall(n->l);
|
||||
}
|
||||
if (n->r != NULL) {
|
||||
sx_radix_node_freeall(n->r);
|
||||
}
|
||||
if (n->son != NULL) {
|
||||
sx_radix_node_freeall(n->son);
|
||||
}
|
||||
void
|
||||
sx_radix_node_freeall(struct sx_radix_node *n) {
|
||||
|
||||
if (n->payload) {
|
||||
free(n->payload);
|
||||
}
|
||||
sx_prefix_destroy(n->prefix);
|
||||
free(n);
|
||||
if (n->l != NULL)
|
||||
sx_radix_node_freeall(n->l);
|
||||
|
||||
if (n->r != NULL)
|
||||
sx_radix_node_freeall(n->r);
|
||||
|
||||
if (n->son != NULL)
|
||||
sx_radix_node_freeall(n->son);
|
||||
|
||||
if (n->payload)
|
||||
free(n->payload);
|
||||
|
||||
sx_prefix_destroy(n->prefix);
|
||||
|
||||
free(n);
|
||||
}
|
||||
|
||||
void sx_radix_tree_freeall(struct sx_radix_tree *t) {
|
||||
if (t->head != NULL) {
|
||||
sx_radix_node_freeall(t->head);
|
||||
}
|
||||
free(t);
|
||||
void
|
||||
sx_radix_tree_freeall(struct sx_radix_tree *t) {
|
||||
|
||||
if (t->head != NULL)
|
||||
sx_radix_node_freeall(t->head);
|
||||
|
||||
free(t);
|
||||
}
|
||||
|
||||
void bgpq_prequest_freeall(struct bgpq_prequest *bpr) {
|
||||
|
||||
void
|
||||
bgpq_prequest_freeall(struct bgpq_prequest *bpr) {
|
||||
}
|
||||
|
||||
void expander_freeall(struct bgpq_expander *expander) {
|
||||
void
|
||||
expander_freeall(struct bgpq_expander *expander) {
|
||||
|
||||
// printf("starting to free all\n");
|
||||
// seg fault here
|
||||
// if (expander->sources != NULL) {
|
||||
// printf("freeing soruces\n");
|
||||
// free(expander->sources);
|
||||
//}
|
||||
// if (expander->name != NULL) {
|
||||
// printf("freeing name\n");
|
||||
// free(expander->name);
|
||||
//}
|
||||
// printf("freeing asn32s\n");
|
||||
for (int i = 0; i < 65536; i++) {
|
||||
if (expander->asn32s[i] != NULL) {
|
||||
free(expander->asn32s[i]);
|
||||
}
|
||||
}
|
||||
// if (expander->match != NULL) {
|
||||
// printf("freeing match\n");
|
||||
// free(expander->match);
|
||||
//}
|
||||
//if (expander->server != NULL) {
|
||||
// printf("freeing server\n");
|
||||
// free(expander->server);
|
||||
//}
|
||||
//if (expander->port != NULL) {
|
||||
// printf("freeing port\n");
|
||||
// free(expander->port);
|
||||
//}
|
||||
//if (expander->format != NULL) {
|
||||
// printf("freeing format\n");
|
||||
// free(expander->format);
|
||||
//}
|
||||
// printf("starting to free all\n");
|
||||
// seg fault here
|
||||
// if (expander->sources != NULL) {
|
||||
// printf("freeing soruces\n");
|
||||
// free(expander->sources);
|
||||
//}
|
||||
// if (expander->name != NULL) {
|
||||
// printf("freeing name\n");
|
||||
// free(expander->name);
|
||||
//}
|
||||
// printf("freeing asn32s\n");
|
||||
|
||||
sx_radix_tree_freeall(expander->tree);
|
||||
for (int i = 0; i < 65536; i++) {
|
||||
if (expander->asn32s[i] != NULL) {
|
||||
free(expander->asn32s[i]);
|
||||
}
|
||||
}
|
||||
|
||||
bgpq_prequest_freeall(expander->firstpipe);
|
||||
bgpq_prequest_freeall(expander->lastpipe);
|
||||
// printf("finished freeing all\n");
|
||||
|
||||
// if (expander->match != NULL) {
|
||||
// printf("freeing match\n");
|
||||
// free(expander->match);
|
||||
//}
|
||||
//if (expander->server != NULL) {
|
||||
// printf("freeing server\n");
|
||||
// free(expander->server);
|
||||
//}
|
||||
//if (expander->port != NULL) {
|
||||
// printf("freeing port\n");
|
||||
// free(expander->port);
|
||||
//}
|
||||
//if (expander->format != NULL) {
|
||||
// printf("freeing format\n");
|
||||
// free(expander->format);
|
||||
//}
|
||||
|
||||
sx_radix_tree_freeall(expander->tree);
|
||||
|
||||
bgpq_prequest_freeall(expander->firstpipe);
|
||||
bgpq_prequest_freeall(expander->lastpipe);
|
||||
|
||||
// printf("finished freeing all\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -62,11 +62,11 @@ strlcpy(dst, src, siz)
|
||||
/* Not enough room in dst, add NUL and traverse rest of src */
|
||||
if (n == 0) {
|
||||
if (siz != 0)
|
||||
*d = '\0'; /* NUL-terminate dst */
|
||||
*d = '\0'; /* NUL-terminate dst */
|
||||
while (*s++)
|
||||
;
|
||||
}
|
||||
|
||||
return(s - src - 1); /* count does not include NUL */
|
||||
return(s - src - 1); /* count does not include NUL */
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -18,66 +18,85 @@
|
||||
int
|
||||
sx_maxsockbuf(int s, int dir)
|
||||
{
|
||||
int optval=0, voptval;
|
||||
int hiconf=-1, loconf=-1;
|
||||
int optval = 0, voptval;
|
||||
int hiconf = -1, loconf = -1;
|
||||
unsigned int voptlen;
|
||||
int phase=0, iterations=0;
|
||||
int phase = 0, iterations = 0;
|
||||
|
||||
if(s<0) {
|
||||
sx_report(SX_FATAL,"Unable to maximize sockbuf on invalid socket %i\n",
|
||||
s);
|
||||
if (s<0) {
|
||||
sx_report(SX_FATAL,"Unable to maximize sockbuf on invalid "
|
||||
"socket %i\n", s);
|
||||
exit(1);
|
||||
};
|
||||
|
||||
voptlen = sizeof(optval);
|
||||
|
||||
voptlen=sizeof(optval);
|
||||
if(getsockopt(s,SOL_SOCKET,dir,(void*)&optval,&voptlen)==-1) {
|
||||
sx_report(SX_ERROR,"initial getsockopt failed: %s\n", strerror(errno));
|
||||
if (getsockopt(s, SOL_SOCKET, dir, (void*)&optval, &voptlen) == -1) {
|
||||
sx_report(SX_ERROR,"initial getsockopt failed: %s\n",
|
||||
strerror(errno));
|
||||
return -1;
|
||||
};
|
||||
|
||||
for(;;) {
|
||||
for (;;) {
|
||||
iterations++;
|
||||
if(phase==0) optval<<=1;
|
||||
|
||||
if (phase == 0)
|
||||
optval<<=1;
|
||||
else {
|
||||
if(optval==(hiconf+loconf)/2) break;
|
||||
optval=(hiconf+loconf)/2;
|
||||
if (optval == (hiconf + loconf) / 2)
|
||||
break;
|
||||
optval = (hiconf + loconf) / 2;
|
||||
};
|
||||
if(optval>SX_MAXSOCKBUF_MAX && phase==0)
|
||||
|
||||
if (optval > SX_MAXSOCKBUF_MAX && phase == 0)
|
||||
break;
|
||||
|
||||
if(setsockopt(s,SOL_SOCKET,dir,(void*)&optval,sizeof(optval))==-1)
|
||||
{
|
||||
if(phase==0) phase=1;
|
||||
hiconf=optval;
|
||||
if (setsockopt(s, SOL_SOCKET, dir, (void*)&optval,
|
||||
sizeof(optval)) == -1) {
|
||||
|
||||
if (phase == 0)
|
||||
phase = 1;
|
||||
|
||||
hiconf = optval;
|
||||
|
||||
continue;
|
||||
} else {
|
||||
loconf=optval;
|
||||
loconf = optval;
|
||||
};
|
||||
|
||||
voptlen=sizeof(voptval);
|
||||
voptlen = sizeof(voptval);
|
||||
|
||||
if(getsockopt(s,SOL_SOCKET,dir,(void*)&voptval,&voptlen)==-1) {
|
||||
sx_report(SX_ERROR,"getsockopt failed: %s\n", strerror(errno));
|
||||
if (getsockopt(s, SOL_SOCKET, dir, (void*)&voptval,
|
||||
&voptlen) == -1) {
|
||||
sx_report(SX_ERROR,"getsockopt failed: %s\n",
|
||||
strerror(errno));
|
||||
return -1;
|
||||
} else if(voptval<optval) {
|
||||
if(phase==0) {
|
||||
phase=1; optval>>=1; continue;
|
||||
} else if(phase==1) {
|
||||
phase=2; optval-=2048; continue;
|
||||
} else break;
|
||||
} else if(voptval>=SX_MAXSOCKBUF_MAX) {
|
||||
/* ... and getsockopt not failed and voptval>=optval. Do not allow
|
||||
* to increase sockbuf too much even in case OS permits it */
|
||||
} else if (voptval < optval) {
|
||||
if (phase == 0) {
|
||||
phase = 1;
|
||||
optval >>= 1;
|
||||
continue;
|
||||
} else if (phase == 1) {
|
||||
phase = 2;
|
||||
optval -= 2048;
|
||||
continue;
|
||||
} else
|
||||
break;
|
||||
} else if (voptval >= SX_MAXSOCKBUF_MAX) {
|
||||
/*
|
||||
* ... and getsockopt not failed and voptval>=optval.
|
||||
* Do not allow to increase sockbuf too much even in
|
||||
* case OS permits it
|
||||
*/
|
||||
break;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
voptlen=sizeof(voptval);
|
||||
if(getsockopt(s,SOL_SOCKET,dir,(void*)&voptval,&voptlen)==-1) {
|
||||
voptlen = sizeof(voptval);
|
||||
if (getsockopt(s, SOL_SOCKET, dir, (void*)&voptval,
|
||||
&voptlen) == -1) {
|
||||
sx_report(SX_ERROR,"getsockopt(final stage) failed: %s\n",
|
||||
strerror(errno));
|
||||
strerror(errno));
|
||||
return -1;
|
||||
} else {
|
||||
/*
|
||||
@@ -85,5 +104,6 @@ sx_maxsockbuf(int s, int dir)
|
||||
voptval, iterations);
|
||||
*/
|
||||
};
|
||||
|
||||
return voptval;
|
||||
};
|
||||
|
||||
1327
sx_prefix.c
1327
sx_prefix.c
File diff suppressed because it is too large
Load Diff
75
sx_report.c
75
sx_report.c
@@ -18,13 +18,19 @@ static int reportStderr=1;
|
||||
static char const*
|
||||
sx_report_name(sx_report_t t)
|
||||
{
|
||||
switch(t) {
|
||||
case SX_MISFEATURE: return "MISSING FEATURE:";
|
||||
case SX_FATAL: return "FATAL ERROR:";
|
||||
case SX_ERROR: return "ERROR:";
|
||||
case SX_NOTICE: return "Notice:";
|
||||
case SX_DEBUG: return "Debug:";
|
||||
switch (t) {
|
||||
case SX_MISFEATURE:
|
||||
return "MISSING FEATURE:";
|
||||
case SX_FATAL:
|
||||
return "FATAL ERROR:";
|
||||
case SX_ERROR:
|
||||
return "ERROR:";
|
||||
case SX_NOTICE:
|
||||
return "Notice:";
|
||||
case SX_DEBUG:
|
||||
return "Debug:";
|
||||
};
|
||||
|
||||
return "...... HMMMMM.... ERROR... \n";
|
||||
};
|
||||
|
||||
@@ -33,54 +39,55 @@ sx_report(sx_report_t t, char* fmt, ...)
|
||||
{
|
||||
char buffer[65536];
|
||||
va_list ap;
|
||||
va_start(ap,fmt);
|
||||
va_start(ap, fmt);
|
||||
|
||||
vsnprintf(buffer,sizeof(buffer),fmt,ap);
|
||||
vsnprintf(buffer, sizeof(buffer), fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if(reportStderr) {
|
||||
fputs(sx_report_name(t),stderr);
|
||||
fputs(buffer,stderr);
|
||||
if (reportStderr) {
|
||||
fputs(sx_report_name(t), stderr);
|
||||
fputs(buffer, stderr);
|
||||
} else {
|
||||
switch(t) {
|
||||
case SX_FATAL:
|
||||
syslog(LOG_ERR,"FATAL ERROR: %s", buffer);
|
||||
break;
|
||||
case SX_MISFEATURE:
|
||||
case SX_ERROR:
|
||||
syslog(LOG_ERR,"ERROR: %s", buffer);
|
||||
break;
|
||||
case SX_NOTICE:
|
||||
syslog(LOG_WARNING,"Notice: %s", buffer);
|
||||
break;
|
||||
case SX_DEBUG:
|
||||
syslog(LOG_DEBUG,"Debug: %s", buffer);
|
||||
break;
|
||||
case SX_FATAL:
|
||||
syslog(LOG_ERR,"FATAL ERROR: %s", buffer);
|
||||
break;
|
||||
case SX_MISFEATURE:
|
||||
case SX_ERROR:
|
||||
syslog(LOG_ERR,"ERROR: %s", buffer);
|
||||
break;
|
||||
case SX_NOTICE:
|
||||
syslog(LOG_WARNING,"Notice: %s", buffer);
|
||||
break;
|
||||
case SX_DEBUG:
|
||||
syslog(LOG_DEBUG,"Debug: %s", buffer);
|
||||
break;
|
||||
};
|
||||
};
|
||||
|
||||
if(t==SX_FATAL) exit(-1);
|
||||
if (t == SX_FATAL)
|
||||
exit(-1);
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
int
|
||||
sx_debug(char const* const file, char const* const func, int const line,
|
||||
char* fmt, ...)
|
||||
char* fmt, ...)
|
||||
{
|
||||
char buffer[65536];
|
||||
char bline[65536];
|
||||
|
||||
va_list ap;
|
||||
va_start(ap,fmt);
|
||||
va_start(ap, fmt);
|
||||
|
||||
vsnprintf(buffer,sizeof(buffer),fmt,ap);
|
||||
vsnprintf(buffer, sizeof(buffer), fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
snprintf(bline,sizeof(bline),"DEBUG: %s:%i %s ", file, line, func);
|
||||
if(reportStderr) {
|
||||
fputs(bline,stderr);
|
||||
fputs(buffer,stderr);
|
||||
snprintf(bline, sizeof(bline), "DEBUG: %s:%i %s ", file, line, func);
|
||||
if (reportStderr) {
|
||||
fputs(bline, stderr);
|
||||
fputs(buffer, stderr);
|
||||
} else {
|
||||
syslog(LOG_DEBUG,"%s %s", bline, buffer);
|
||||
};
|
||||
@@ -91,7 +98,7 @@ sx_debug(char const* const file, char const* const func, int const line,
|
||||
void
|
||||
sx_openlog(char* progname)
|
||||
{
|
||||
openlog(progname?progname:"<unknown>",LOG_PID,LOG_DAEMON);
|
||||
reportStderr=0;
|
||||
openlog(progname ? progname : "<unknown>", LOG_PID, LOG_DAEMON);
|
||||
reportStderr = 0;
|
||||
};
|
||||
|
||||
|
||||
17
sx_slentry.c
17
sx_slentry.c
@@ -8,10 +8,16 @@
|
||||
struct sx_slentry*
|
||||
sx_slentry_new(char* t)
|
||||
{
|
||||
struct sx_slentry* e=malloc(sizeof(struct sx_slentry));
|
||||
if(!e) return NULL;
|
||||
memset(e,0,sizeof(struct sx_slentry));
|
||||
if(t) e->text=strdup(t);
|
||||
struct sx_slentry* e = malloc(sizeof(struct sx_slentry));
|
||||
|
||||
if (!e)
|
||||
return NULL;
|
||||
|
||||
memset(e, 0, sizeof(struct sx_slentry));
|
||||
|
||||
if (t)
|
||||
e->text = strdup(t);
|
||||
|
||||
return e;
|
||||
};
|
||||
|
||||
@@ -19,9 +25,12 @@ struct sx_tentry*
|
||||
sx_tentry_new(char* t)
|
||||
{
|
||||
struct sx_tentry* te = malloc(sizeof(struct sx_tentry));
|
||||
|
||||
if (!te)
|
||||
return NULL;
|
||||
|
||||
memset(te, 0, sizeof(struct sx_tentry));
|
||||
te->text = strdup(t);
|
||||
|
||||
return te;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user