xref: /minix3/external/bsd/tcpdump/dist/print-igrp.c (revision b636d99d91c3d54204248f643c14627405d4afd1)
1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek  * Copyright (c) 1996, 1997
3*b636d99dSDavid van Moolenbroek  *	The Regents of the University of California.  All rights reserved.
4*b636d99dSDavid van Moolenbroek  *
5*b636d99dSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
6*b636d99dSDavid van Moolenbroek  * modification, are permitted provided that: (1) source code distributions
7*b636d99dSDavid van Moolenbroek  * retain the above copyright notice and this paragraph in its entirety, (2)
8*b636d99dSDavid van Moolenbroek  * distributions including binary code include the above copyright notice and
9*b636d99dSDavid van Moolenbroek  * this paragraph in its entirety in the documentation or other materials
10*b636d99dSDavid van Moolenbroek  * provided with the distribution, and (3) all advertising materials mentioning
11*b636d99dSDavid van Moolenbroek  * features or use of this software display the following acknowledgement:
12*b636d99dSDavid van Moolenbroek  * ``This product includes software developed by the University of California,
13*b636d99dSDavid van Moolenbroek  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14*b636d99dSDavid van Moolenbroek  * the University nor the names of its contributors may be used to endorse
15*b636d99dSDavid van Moolenbroek  * or promote products derived from this software without specific prior
16*b636d99dSDavid van Moolenbroek  * written permission.
17*b636d99dSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18*b636d99dSDavid van Moolenbroek  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19*b636d99dSDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20*b636d99dSDavid van Moolenbroek  *
21*b636d99dSDavid van Moolenbroek  * Initial contribution from Francis Dupont (francis.dupont@inria.fr)
22*b636d99dSDavid van Moolenbroek  */
23*b636d99dSDavid van Moolenbroek 
24*b636d99dSDavid van Moolenbroek #include <sys/cdefs.h>
25*b636d99dSDavid van Moolenbroek #ifndef lint
26*b636d99dSDavid van Moolenbroek __RCSID("$NetBSD: print-igrp.c,v 1.5 2014/11/20 03:05:03 christos Exp $");
27*b636d99dSDavid van Moolenbroek #endif
28*b636d99dSDavid van Moolenbroek 
29*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
30*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
31*b636d99dSDavid van Moolenbroek #include "config.h"
32*b636d99dSDavid van Moolenbroek #endif
33*b636d99dSDavid van Moolenbroek 
34*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
35*b636d99dSDavid van Moolenbroek 
36*b636d99dSDavid van Moolenbroek #include "interface.h"
37*b636d99dSDavid van Moolenbroek #include "extract.h"			/* must come after interface.h */
38*b636d99dSDavid van Moolenbroek 
39*b636d99dSDavid van Moolenbroek /* Cisco IGRP definitions */
40*b636d99dSDavid van Moolenbroek 
41*b636d99dSDavid van Moolenbroek /* IGRP Header */
42*b636d99dSDavid van Moolenbroek 
43*b636d99dSDavid van Moolenbroek struct igrphdr {
44*b636d99dSDavid van Moolenbroek 	uint8_t ig_vop;	/* protocol version number / opcode */
45*b636d99dSDavid van Moolenbroek #define IGRP_V(x)	(((x) & 0xf0) >> 4)
46*b636d99dSDavid van Moolenbroek #define IGRP_OP(x)	((x) & 0x0f)
47*b636d99dSDavid van Moolenbroek 	uint8_t ig_ed;		/* edition number */
48*b636d99dSDavid van Moolenbroek 	uint16_t ig_as;	/* autonomous system number */
49*b636d99dSDavid van Moolenbroek 	uint16_t ig_ni;	/* number of subnet in local net */
50*b636d99dSDavid van Moolenbroek 	uint16_t ig_ns;	/* number of networks in AS */
51*b636d99dSDavid van Moolenbroek 	uint16_t ig_nx;	/* number of networks ouside AS */
52*b636d99dSDavid van Moolenbroek 	uint16_t ig_sum;	/* checksum of IGRP header & data */
53*b636d99dSDavid van Moolenbroek };
54*b636d99dSDavid van Moolenbroek 
55*b636d99dSDavid van Moolenbroek #define IGRP_UPDATE	1
56*b636d99dSDavid van Moolenbroek #define IGRP_REQUEST	2
57*b636d99dSDavid van Moolenbroek 
58*b636d99dSDavid van Moolenbroek /* IGRP routing entry */
59*b636d99dSDavid van Moolenbroek 
60*b636d99dSDavid van Moolenbroek struct igrprte {
61*b636d99dSDavid van Moolenbroek 	uint8_t igr_net[3];	/* 3 significant octets of IP address */
62*b636d99dSDavid van Moolenbroek 	uint8_t igr_dly[3];	/* delay in tens of microseconds */
63*b636d99dSDavid van Moolenbroek 	uint8_t igr_bw[3];	/* bandwidth in units of 1 kb/s */
64*b636d99dSDavid van Moolenbroek 	uint8_t igr_mtu[2];	/* MTU in octets */
65*b636d99dSDavid van Moolenbroek 	uint8_t igr_rel;	/* percent packets successfully tx/rx */
66*b636d99dSDavid van Moolenbroek 	uint8_t igr_ld;	/* percent of channel occupied */
67*b636d99dSDavid van Moolenbroek 	uint8_t igr_hct;	/* hop count */
68*b636d99dSDavid van Moolenbroek };
69*b636d99dSDavid van Moolenbroek 
70*b636d99dSDavid van Moolenbroek #define IGRP_RTE_SIZE	14	/* don't believe sizeof ! */
71*b636d99dSDavid van Moolenbroek 
72*b636d99dSDavid van Moolenbroek static void
igrp_entry_print(netdissect_options * ndo,register struct igrprte * igr,register int is_interior,register int is_exterior)73*b636d99dSDavid van Moolenbroek igrp_entry_print(netdissect_options *ndo, register struct igrprte *igr,
74*b636d99dSDavid van Moolenbroek     register int is_interior, register int is_exterior)
75*b636d99dSDavid van Moolenbroek {
76*b636d99dSDavid van Moolenbroek 	register u_int delay, bandwidth;
77*b636d99dSDavid van Moolenbroek 	u_int metric, mtu;
78*b636d99dSDavid van Moolenbroek 
79*b636d99dSDavid van Moolenbroek 	if (is_interior)
80*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " *.%d.%d.%d", igr->igr_net[0],
81*b636d99dSDavid van Moolenbroek 		    igr->igr_net[1], igr->igr_net[2]));
82*b636d99dSDavid van Moolenbroek 	else if (is_exterior)
83*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " X%d.%d.%d.0", igr->igr_net[0],
84*b636d99dSDavid van Moolenbroek 		    igr->igr_net[1], igr->igr_net[2]));
85*b636d99dSDavid van Moolenbroek 	else
86*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " %d.%d.%d.0", igr->igr_net[0],
87*b636d99dSDavid van Moolenbroek 		    igr->igr_net[1], igr->igr_net[2]));
88*b636d99dSDavid van Moolenbroek 
89*b636d99dSDavid van Moolenbroek 	delay = EXTRACT_24BITS(igr->igr_dly);
90*b636d99dSDavid van Moolenbroek 	bandwidth = EXTRACT_24BITS(igr->igr_bw);
91*b636d99dSDavid van Moolenbroek 	metric = bandwidth + delay;
92*b636d99dSDavid van Moolenbroek 	if (metric > 0xffffff)
93*b636d99dSDavid van Moolenbroek 		metric = 0xffffff;
94*b636d99dSDavid van Moolenbroek 	mtu = EXTRACT_16BITS(igr->igr_mtu);
95*b636d99dSDavid van Moolenbroek 
96*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, " d=%d b=%d r=%d l=%d M=%d mtu=%d in %d hops",
97*b636d99dSDavid van Moolenbroek 	    10 * delay, bandwidth == 0 ? 0 : 10000000 / bandwidth,
98*b636d99dSDavid van Moolenbroek 	    igr->igr_rel, igr->igr_ld, metric,
99*b636d99dSDavid van Moolenbroek 	    mtu, igr->igr_hct));
100*b636d99dSDavid van Moolenbroek }
101*b636d99dSDavid van Moolenbroek 
102*b636d99dSDavid van Moolenbroek static const struct tok op2str[] = {
103*b636d99dSDavid van Moolenbroek 	{ IGRP_UPDATE,		"update" },
104*b636d99dSDavid van Moolenbroek 	{ IGRP_REQUEST,		"request" },
105*b636d99dSDavid van Moolenbroek 	{ 0,			NULL }
106*b636d99dSDavid van Moolenbroek };
107*b636d99dSDavid van Moolenbroek 
108*b636d99dSDavid van Moolenbroek void
igrp_print(netdissect_options * ndo,register const u_char * bp,u_int length)109*b636d99dSDavid van Moolenbroek igrp_print(netdissect_options *ndo, register const u_char *bp, u_int length)
110*b636d99dSDavid van Moolenbroek {
111*b636d99dSDavid van Moolenbroek 	register struct igrphdr *hdr;
112*b636d99dSDavid van Moolenbroek 	register u_char *cp;
113*b636d99dSDavid van Moolenbroek 	u_int nint, nsys, next;
114*b636d99dSDavid van Moolenbroek 
115*b636d99dSDavid van Moolenbroek 	hdr = (struct igrphdr *)bp;
116*b636d99dSDavid van Moolenbroek 	cp = (u_char *)(hdr + 1);
117*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "igrp:"));
118*b636d99dSDavid van Moolenbroek 
119*b636d99dSDavid van Moolenbroek 	/* Header */
120*b636d99dSDavid van Moolenbroek 	ND_TCHECK(*hdr);
121*b636d99dSDavid van Moolenbroek 	nint = EXTRACT_16BITS(&hdr->ig_ni);
122*b636d99dSDavid van Moolenbroek 	nsys = EXTRACT_16BITS(&hdr->ig_ns);
123*b636d99dSDavid van Moolenbroek 	next = EXTRACT_16BITS(&hdr->ig_nx);
124*b636d99dSDavid van Moolenbroek 
125*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, " %s V%d edit=%d AS=%d (%d/%d/%d)",
126*b636d99dSDavid van Moolenbroek 	    tok2str(op2str, "op-#%d", IGRP_OP(hdr->ig_vop)),
127*b636d99dSDavid van Moolenbroek 	    IGRP_V(hdr->ig_vop),
128*b636d99dSDavid van Moolenbroek 	    hdr->ig_ed,
129*b636d99dSDavid van Moolenbroek 	    EXTRACT_16BITS(&hdr->ig_as),
130*b636d99dSDavid van Moolenbroek 	    nint,
131*b636d99dSDavid van Moolenbroek 	    nsys,
132*b636d99dSDavid van Moolenbroek 	    next));
133*b636d99dSDavid van Moolenbroek 
134*b636d99dSDavid van Moolenbroek 	length -= sizeof(*hdr);
135*b636d99dSDavid van Moolenbroek 	while (length >= IGRP_RTE_SIZE) {
136*b636d99dSDavid van Moolenbroek 		if (nint > 0) {
137*b636d99dSDavid van Moolenbroek 			ND_TCHECK2(*cp, IGRP_RTE_SIZE);
138*b636d99dSDavid van Moolenbroek 			igrp_entry_print(ndo, (struct igrprte *)cp, 1, 0);
139*b636d99dSDavid van Moolenbroek 			--nint;
140*b636d99dSDavid van Moolenbroek 		} else if (nsys > 0) {
141*b636d99dSDavid van Moolenbroek 			ND_TCHECK2(*cp, IGRP_RTE_SIZE);
142*b636d99dSDavid van Moolenbroek 			igrp_entry_print(ndo, (struct igrprte *)cp, 0, 0);
143*b636d99dSDavid van Moolenbroek 			--nsys;
144*b636d99dSDavid van Moolenbroek 		} else if (next > 0) {
145*b636d99dSDavid van Moolenbroek 			ND_TCHECK2(*cp, IGRP_RTE_SIZE);
146*b636d99dSDavid van Moolenbroek 			igrp_entry_print(ndo, (struct igrprte *)cp, 0, 1);
147*b636d99dSDavid van Moolenbroek 			--next;
148*b636d99dSDavid van Moolenbroek 		} else {
149*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " [extra bytes %d]", length));
150*b636d99dSDavid van Moolenbroek 			break;
151*b636d99dSDavid van Moolenbroek 		}
152*b636d99dSDavid van Moolenbroek 		cp += IGRP_RTE_SIZE;
153*b636d99dSDavid van Moolenbroek 		length -= IGRP_RTE_SIZE;
154*b636d99dSDavid van Moolenbroek 	}
155*b636d99dSDavid van Moolenbroek 	if (nint == 0 && nsys == 0 && next == 0)
156*b636d99dSDavid van Moolenbroek 		return;
157*b636d99dSDavid van Moolenbroek trunc:
158*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, " [|igrp]"));
159*b636d99dSDavid van Moolenbroek }
160