Annotation of embedaddon/quagga/bgpd/bgp_btoa.c, revision 1.1.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>