Annotation of embedaddon/quagga/bgpd/bgp_btoa.c, revision 1.1

1.1     ! misho       1: /* BGP dump to ascii converter
        !             2:    Copyright (C) 1999 Kunihiro Ishiguro
        !             3: 
        !             4: This file is part of GNU Zebra.
        !             5: 
        !             6: GNU Zebra is free software; you can redistribute it and/or modify it
        !             7: under the terms of the GNU General Public License as published by the
        !             8: Free Software Foundation; either version 2, or (at your option) any
        !             9: later version.
        !            10: 
        !            11: GNU Zebra is distributed in the hope that it will be useful, but
        !            12: WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            14: General Public License for more details.
        !            15: 
        !            16: You should have received a copy of the GNU General Public License
        !            17: along with GNU Zebra; see the file COPYING.  If not, write to the Free
        !            18: Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
        !            19: 02111-1307, USA.  */
        !            20: 
        !            21: #include <zebra.h>
        !            22: 
        !            23: #include "zebra.h"
        !            24: #include "stream.h"
        !            25: #include "log.h"
        !            26: #include "prefix.h"
        !            27: #include "command.h"
        !            28: #include "memory.h"
        !            29: #include "privs.h"
        !            30: #include "filter.h"
        !            31: 
        !            32: #include "bgpd/bgpd.h"
        !            33: #include "bgpd/bgp_dump.h"
        !            34: #include "bgpd/bgp_attr.h"
        !            35: #include "bgpd/bgp_aspath.h"
        !            36: 
        !            37: /* privileges */
        !            38: static zebra_capabilities_t _caps_p [] =
        !            39: {
        !            40:     ZCAP_BIND,
        !            41:     ZCAP_NET_RAW,
        !            42:     ZCAP_NET_ADMIN,
        !            43: };
        !            44: 
        !            45: struct zebra_privs_t bgpd_privs =
        !            46: {
        !            47: #if defined(QUAGGA_USER) && defined(QUAGGA_GROUP)
        !            48:   .user = QUAGGA_USER,
        !            49:   .group = QUAGGA_GROUP,
        !            50: #endif
        !            51: #ifdef VTY_GROUP
        !            52:   .vty_group = VTY_GROUP,
        !            53: #endif
        !            54:   .caps_p = _caps_p,
        !            55:   .cap_num_p = array_size(_caps_p),
        !            56:   .cap_num_i = 0,
        !            57: };
        !            58: 
        !            59: enum MRT_MSG_TYPES {
        !            60:    MSG_NULL,
        !            61:    MSG_START,                   /* sender is starting up */
        !            62:    MSG_DIE,                     /* receiver should shut down */
        !            63:    MSG_I_AM_DEAD,               /* sender is shutting down */
        !            64:    MSG_PEER_DOWN,               /* sender's peer is down */
        !            65:    MSG_PROTOCOL_BGP,            /* msg is a BGP packet */
        !            66:    MSG_PROTOCOL_RIP,            /* msg is a RIP packet */
        !            67:    MSG_PROTOCOL_IDRP,           /* msg is an IDRP packet */
        !            68:    MSG_PROTOCOL_RIPNG,          /* msg is a RIPNG packet */
        !            69:    MSG_PROTOCOL_BGP4PLUS,       /* msg is a BGP4+ packet */
        !            70:    MSG_PROTOCOL_BGP4PLUS_01,    /* msg is a BGP4+ (draft 01) packet */
        !            71:    MSG_PROTOCOL_OSPF,           /* msg is an OSPF packet */
        !            72:    MSG_TABLE_DUMP               /* routing table dump */
        !            73: };
        !            74: 
        !            75: static int
        !            76: attr_parse (struct stream *s, u_int16_t len)
        !            77: {
        !            78:   u_int flag;
        !            79:   u_int type;
        !            80:   u_int16_t length;
        !            81:   u_int16_t lim;
        !            82: 
        !            83:   lim = s->getp + len;
        !            84: 
        !            85:   printf ("attr_parse s->getp %zd, len %d, lim %d\n", s->getp, len, lim);
        !            86: 
        !            87:   while (s->getp < lim)
        !            88:     {
        !            89:       flag = stream_getc (s);
        !            90:       type = stream_getc (s);
        !            91: 
        !            92:       if (flag & BGP_ATTR_FLAG_EXTLEN)
        !            93:        length = stream_getw (s);
        !            94:       else
        !            95:        length = stream_getc (s);
        !            96: 
        !            97:       printf ("FLAG: %d\n", flag);
        !            98:       printf ("TYPE: %d\n", type);
        !            99:       printf ("Len: %d\n", length);
        !           100: 
        !           101:       switch (type)
        !           102:        {
        !           103:        case BGP_ATTR_ORIGIN:
        !           104:          {
        !           105:            u_char origin;
        !           106:            origin = stream_getc (s);
        !           107:            printf ("ORIGIN: %d\n", origin);
        !           108:          }
        !           109:          break;
        !           110:        case BGP_ATTR_AS_PATH:
        !           111:          {
        !           112:            struct aspath *aspath;
        !           113: 
        !           114:            aspath = aspath_parse (s, length, 1);
        !           115:            printf ("ASPATH: %s\n", aspath->str);
        !           116:            aspath_free(aspath);
        !           117:          }
        !           118:          break;
        !           119:        case BGP_ATTR_NEXT_HOP:
        !           120:          {
        !           121:            struct in_addr nexthop;
        !           122:            nexthop.s_addr = stream_get_ipv4 (s);
        !           123:            printf ("NEXTHOP: %s\n", inet_ntoa (nexthop));
        !           124:          }
        !           125:          break;
        !           126:        default:
        !           127:          stream_getw_from (s, length);
        !           128:          break;
        !           129:        }
        !           130:     }
        !           131: 
        !           132:   return 0;
        !           133: }
        !           134: 
        !           135: int
        !           136: main (int argc, char **argv)
        !           137: {
        !           138:   int ret;
        !           139:   FILE *fp;
        !           140:   struct stream *s;
        !           141:   time_t now;
        !           142:   int type;
        !           143:   int subtype;
        !           144:   size_t len;
        !           145:   int source_as;
        !           146:   int dest_as;
        !           147:   ifindex_t ifindex;
        !           148:   int family;
        !           149:   struct in_addr sip;
        !           150:   struct in_addr dip;
        !           151:   u_int16_t viewno, seq_num;
        !           152:   struct prefix_ipv4 p;
        !           153: 
        !           154:   s = stream_new (10000);
        !           155: 
        !           156:   if (argc != 2)
        !           157:     {
        !           158:       fprintf (stderr, "Usage: %s FILENAME\n", argv[0]);
        !           159:       exit (1);
        !           160:     }
        !           161:   fp = fopen (argv[1], "r");
        !           162:   if (!fp)
        !           163:     {
        !           164:       perror ("fopen");
        !           165:       exit (1);
        !           166:     }
        !           167:   
        !           168:   while (1)
        !           169:     {
        !           170:       stream_reset (s);
        !           171: 
        !           172:       ret = fread (s->data, 12, 1, fp);
        !           173:       if (!ret || feof (fp))
        !           174:        {
        !           175:          printf ("END OF FILE\n");
        !           176:          break;
        !           177:        }
        !           178:       if (ferror (fp))
        !           179:        {
        !           180:          printf ("ERROR OF FREAD\n");
        !           181:          break;
        !           182:        }
        !           183: 
        !           184:       /* Extract header. */
        !           185:       now = stream_getl (s);
        !           186:       type = stream_getw (s);
        !           187:       subtype = stream_getw (s);
        !           188:       len = stream_getl (s);
        !           189: 
        !           190:       printf ("TIME: %s", ctime (&now));
        !           191: 
        !           192:       /* printf ("TYPE: %d/%d\n", type, subtype); */
        !           193: 
        !           194:       if (type == MSG_PROTOCOL_BGP4MP)
        !           195:        printf ("TYPE: BGP4MP");
        !           196:       else if (type == MSG_PROTOCOL_BGP4MP_ET)
        !           197:        printf ("TYPE: BGP4MP_ET");
        !           198:       else if (type == MSG_TABLE_DUMP)
        !           199:        printf ("TYPE: MSG_TABLE_DUMP");
        !           200:       else
        !           201:        printf ("TYPE: Unknown %d", type);
        !           202: 
        !           203:       if (type == MSG_TABLE_DUMP)
        !           204:        switch (subtype)
        !           205:          {
        !           206:          case AFI_IP:
        !           207:            printf ("/AFI_IP\n");
        !           208:            break;
        !           209:          case AFI_IP6:
        !           210:            printf ("/AFI_IP6\n");
        !           211:            break;
        !           212:          default:
        !           213:            printf ("/UNKNOWN %d", subtype);
        !           214:            break;
        !           215:          }
        !           216:       else
        !           217:        {
        !           218:          switch (subtype)
        !           219:            {
        !           220:            case BGP4MP_STATE_CHANGE:
        !           221:              printf ("/CHANGE\n");
        !           222:              break;
        !           223:            case BGP4MP_MESSAGE:
        !           224:              printf ("/MESSAGE\n");
        !           225:              break;
        !           226:            case BGP4MP_ENTRY:
        !           227:              printf ("/ENTRY\n");
        !           228:              break;
        !           229:            case BGP4MP_SNAPSHOT:
        !           230:              printf ("/SNAPSHOT\n");
        !           231:              break;
        !           232:            default:
        !           233:              printf ("/UNKNOWN %d", subtype);
        !           234:              break;
        !           235:            }
        !           236:        }
        !           237: 
        !           238:       printf ("len: %zd\n", len);
        !           239: 
        !           240:       ret = fread (s->data + 12, len, 1, fp);
        !           241:       if (feof (fp))
        !           242:        {
        !           243:          printf ("ENDOF FILE 2\n");
        !           244:          break;
        !           245:        }
        !           246:       if (ferror (fp))
        !           247:        {
        !           248:          printf ("ERROR OF FREAD 2\n");
        !           249:          break;
        !           250:        }
        !           251: 
        !           252:       /* printf ("now read %d\n", len); */
        !           253: 
        !           254:       if (type == MSG_TABLE_DUMP)
        !           255:        {
        !           256:          u_char status;
        !           257:          time_t originated;
        !           258:          struct in_addr peer;
        !           259:          u_int16_t attrlen;
        !           260: 
        !           261:          viewno = stream_getw (s);
        !           262:          seq_num = stream_getw (s);
        !           263:          printf ("VIEW: %d\n", viewno);
        !           264:          printf ("SEQUENCE: %d\n", seq_num);
        !           265: 
        !           266:          /* start */
        !           267:          while (s->getp < len - 16)
        !           268:            {
        !           269:              p.prefix.s_addr = stream_get_ipv4 (s);
        !           270:              p.prefixlen = stream_getc (s);
        !           271:              printf ("PREFIX: %s/%d\n", inet_ntoa (p.prefix), p.prefixlen);
        !           272: 
        !           273:              status = stream_getc (s);
        !           274:              originated = stream_getl (s);
        !           275:              peer.s_addr = stream_get_ipv4 (s);
        !           276:              source_as = stream_getw(s);
        !           277: 
        !           278:              printf ("FROM: %s AS%d\n", inet_ntoa (peer), source_as);
        !           279:              printf ("ORIGINATED: %s", ctime (&originated));
        !           280: 
        !           281:              attrlen = stream_getw (s);
        !           282:              printf ("ATTRLEN: %d\n", attrlen);
        !           283: 
        !           284:              attr_parse (s, attrlen);
        !           285: 
        !           286:              printf ("STATUS: 0x%x\n", status);
        !           287:            }
        !           288:        }
        !           289:       else
        !           290:        {
        !           291:          source_as = stream_getw (s);
        !           292:          dest_as = stream_getw (s);
        !           293:          printf ("source_as: %d\n", source_as);
        !           294:          printf ("dest_as: %d\n", dest_as);
        !           295: 
        !           296:          ifindex = stream_getw (s);
        !           297:          family = stream_getw (s);
        !           298: 
        !           299:          printf ("ifindex: %d\n", ifindex);
        !           300:          printf ("family: %d\n", family);
        !           301: 
        !           302:          sip.s_addr = stream_get_ipv4 (s);
        !           303:          dip.s_addr = stream_get_ipv4 (s);
        !           304:          
        !           305:          printf ("saddr: %s\n", inet_ntoa (sip));
        !           306:          printf ("daddr: %s\n", inet_ntoa (dip));
        !           307: 
        !           308:          printf ("\n");
        !           309:        }
        !           310:     }
        !           311:   fclose (fp);
        !           312:   return 0;
        !           313: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>