/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 2002-2012 AT&T Intellectual Property *
* and is licensed under the *
* Eclipse Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* Glenn Fowler <gsf@research.att.com> *
* *
***********************************************************************/
#pragma prototyped
/*
* bgp cisco method
*
* Glenn Fowler
* AT&T Research
*/
#include "bgplib.h"
typedef struct Ciscostate_s
{
} Ciscostate_t;
/*
* cisco identf
*/
static int
{
register char* s;
register char* e;
register char* f;
register int c;
char* t;
unsigned char bits;
s = (char*)buf;
e = s + n;
for (;;)
{
for (;;)
{
if (s >= e)
return 0;
c = *s++;
if (c == '<' && s < (e - 4) && s[0] == 'b' && s[1] == 'r' && s[2] == '>' && s[3] == ' ')
s += 4;
else if (!isspace(c))
break;
}
f = s - 1;
for (;;)
{
if (s >= e)
return 0;
if (*s++ == '\n')
break;
}
if (!isascii(*f) && (s - f) > 256)
return 0;
if (((c = *f++) == '*' || c == '-' || c == '+' || c == 'r' || c == ' ') &&
((c = *f++) == '>' || c == 'h' || c == ' ') &&
((c = *f++) == 'a' || c == 'd' || c == 'i' || c == 's' || c == ' ') &&
break;
}
return 1;
}
/*
* cisco openf
*/
static int
{
{
return -1;
}
{
sfprintf(file->io, "Status codes: s suppressed, d damped, h history, * valid, > best, i internal, r rib-failure, S stale\n");
}
return 0;
}
/*
* cisco readf
*/
static int
{
register char* s;
register int i;
int n;
int o;
char* e;
char* p;
Cxoperand_t r;
for (;;)
{
return 0;
if (s[0] == ' ' && s[1] == '<' && s[2] == 'b' && s[3] == 'r' && s[4] == '>' && s[5] == ' ')
s += 6;
n = e - s;
if (n > 20 && (s[0] == ' ' || s[0] == '*' || s[0] == '-' || s[0] == '+' || s[0] == 'r') && (s[3] >= '0' && s[3] <= '9' || n > 61 && s[3] == ' ' && s[20] >= '0' && s[20] <= '9'))
{
for (i = 0; i < 3; i++)
switch (s[i])
{
case '>':
break;
case 'a':
break;
case 'd':
break;
case 'h':
break;
case 'i':
break;
case 'r':
break;
case 's':
break;
case 'S':
break;
case '*':
break;
case '+':
break;
case '-':
break;
}
s += 3;
if (*s == ' ')
s += 17;
break;
else
for (s = p; *s == ' '; s++);
if (*s == '\r' || *s == '\n')
{
return 0;
continue;
e = s + n;
while (*s == ' ')
s++;
}
p = s + 41;
break;
if ((i = (*bgp->type_as16path->internalf)(file->dss->cx, bgp->type_as16path, NiL, &bgp->type_as16path->format, &r, p, e - p, file->dss->cx->rm, disc)) < 0)
break;
p += i;
{
for (o = 0, i = 1; i < n; i++)
{
(*disc->errorf)(NiL, disc, 1, "%s: AS path too long -- truncated to %d", file->format->name, o / sizeof(Bgpasn_t));
}
(*disc->errorf)(NiL, disc, 1, "%s: AS path too long -- %d duplicates removed", file->format->name, n - o);
}
for (;;)
{
switch (*p++)
{
case 'C':
if ((i = (*bgp->type_community->internalf)(file->dss->cx, bgp->type_community, NiL, &bgp->type_community->format, &r, p, e - p, file->dss->cx->rm, disc)) < 0)
break;
p += i;
{
(*disc->errorf)(NiL, disc, 1, "%s: cluster list too long -- truncated to %d", file->format->name, n);
}
o += n;
continue;
case 'I':
if ((i = (*bgp->type_cluster->internalf)(file->dss->cx, bgp->type_cluster, NiL, &bgp->type_cluster->format, &r, p, e - p, file->dss->cx->rm, disc)) < 0)
break;
p += i;
{
(*disc->errorf)(NiL, disc, 1, "%s: cluster list too long -- truncated to %d", file->format->name, n);
}
o += n;
continue;
case 'T':
p = e;
continue;
case 'e':
break;
case 'i':
break;
case '?':
break;
case ' ':
case '\t':
continue;
}
break;
}
return 1;
}
}
return 0;
}
/*
* cisco writef
*/
static int
{
register int i;
register int j;
register int k;
else
else
else
else
{
else
}
else
else
{
for (i = 0; i < j; i++)
{
if (k = ap[++i])
{
k += i - 1;
while (i < k)
}
else
}
else
}
{
}
{
}
{
}
{
return -1;
}
return 0;
}
/*
* cisco closef
*/
static int
{
return -1;
return 0;
}
{
"cisco",
"cisco router dump format (2009-03-15)",
CXH,
0,
0,
0,
};