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>