xref: /minix3/external/bsd/tcpdump/dist/print-ripng.c (revision b636d99d91c3d54204248f643c14627405d4afd1)
1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek  * Copyright (c) 1989, 1990, 1991, 1993, 1994
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 
22*b636d99dSDavid van Moolenbroek #include <sys/cdefs.h>
23*b636d99dSDavid van Moolenbroek #ifndef lint
24*b636d99dSDavid van Moolenbroek __RCSID("$NetBSD: print-ripng.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
25*b636d99dSDavid van Moolenbroek #endif
26*b636d99dSDavid van Moolenbroek 
27*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
28*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
29*b636d99dSDavid van Moolenbroek #include "config.h"
30*b636d99dSDavid van Moolenbroek #endif
31*b636d99dSDavid van Moolenbroek 
32*b636d99dSDavid van Moolenbroek #ifdef INET6
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 "addrtoname.h"
38*b636d99dSDavid van Moolenbroek #include "extract.h"
39*b636d99dSDavid van Moolenbroek 
40*b636d99dSDavid van Moolenbroek /*
41*b636d99dSDavid van Moolenbroek  * Copyright (C) 1995, 1996, 1997 and 1998 WIDE Project.
42*b636d99dSDavid van Moolenbroek  * All rights reserved.
43*b636d99dSDavid van Moolenbroek  *
44*b636d99dSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
45*b636d99dSDavid van Moolenbroek  * modification, are permitted provided that the following conditions
46*b636d99dSDavid van Moolenbroek  * are met:
47*b636d99dSDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
48*b636d99dSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
49*b636d99dSDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
50*b636d99dSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
51*b636d99dSDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
52*b636d99dSDavid van Moolenbroek  * 3. Neither the name of the project nor the names of its contributors
53*b636d99dSDavid van Moolenbroek  *    may be used to endorse or promote products derived from this software
54*b636d99dSDavid van Moolenbroek  *    without specific prior written permission.
55*b636d99dSDavid van Moolenbroek  *
56*b636d99dSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
57*b636d99dSDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
58*b636d99dSDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
59*b636d99dSDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
60*b636d99dSDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
61*b636d99dSDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
62*b636d99dSDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
63*b636d99dSDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
64*b636d99dSDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
65*b636d99dSDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
66*b636d99dSDavid van Moolenbroek  * SUCH DAMAGE.
67*b636d99dSDavid van Moolenbroek  */
68*b636d99dSDavid van Moolenbroek #define	RIP6_VERSION	1
69*b636d99dSDavid van Moolenbroek 
70*b636d99dSDavid van Moolenbroek #define	RIP6_REQUEST	1
71*b636d99dSDavid van Moolenbroek #define	RIP6_RESPONSE	2
72*b636d99dSDavid van Moolenbroek 
73*b636d99dSDavid van Moolenbroek struct netinfo6 {
74*b636d99dSDavid van Moolenbroek 	struct in6_addr	rip6_dest;
75*b636d99dSDavid van Moolenbroek 	uint16_t	rip6_tag;
76*b636d99dSDavid van Moolenbroek 	uint8_t		rip6_plen;
77*b636d99dSDavid van Moolenbroek 	uint8_t		rip6_metric;
78*b636d99dSDavid van Moolenbroek };
79*b636d99dSDavid van Moolenbroek 
80*b636d99dSDavid van Moolenbroek struct	rip6 {
81*b636d99dSDavid van Moolenbroek 	uint8_t		rip6_cmd;
82*b636d99dSDavid van Moolenbroek 	uint8_t		rip6_vers;
83*b636d99dSDavid van Moolenbroek 	uint8_t		rip6_res1[2];
84*b636d99dSDavid van Moolenbroek 	union {
85*b636d99dSDavid van Moolenbroek 		struct	netinfo6	ru6_nets[1];
86*b636d99dSDavid van Moolenbroek 		char	ru6_tracefile[1];
87*b636d99dSDavid van Moolenbroek 	} rip6un;
88*b636d99dSDavid van Moolenbroek #define	rip6_nets	rip6un.ru6_nets
89*b636d99dSDavid van Moolenbroek #define	rip6_tracefile	rip6un.ru6_tracefile
90*b636d99dSDavid van Moolenbroek };
91*b636d99dSDavid van Moolenbroek 
92*b636d99dSDavid van Moolenbroek #define	HOPCNT_INFINITY6	16
93*b636d99dSDavid van Moolenbroek 
94*b636d99dSDavid van Moolenbroek #if !defined(IN6_IS_ADDR_UNSPECIFIED) && !defined(_MSC_VER) /* MSVC inline */
IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr * addr)95*b636d99dSDavid van Moolenbroek static int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr *addr)
96*b636d99dSDavid van Moolenbroek {
97*b636d99dSDavid van Moolenbroek     static const struct in6_addr in6addr_any;        /* :: */
98*b636d99dSDavid van Moolenbroek     return (memcmp(addr, &in6addr_any, sizeof(*addr)) == 0);
99*b636d99dSDavid van Moolenbroek }
100*b636d99dSDavid van Moolenbroek #endif
101*b636d99dSDavid van Moolenbroek 
102*b636d99dSDavid van Moolenbroek static int
rip6_entry_print(netdissect_options * ndo,register const struct netinfo6 * ni,int metric)103*b636d99dSDavid van Moolenbroek rip6_entry_print(netdissect_options *ndo, register const struct netinfo6 *ni, int metric)
104*b636d99dSDavid van Moolenbroek {
105*b636d99dSDavid van Moolenbroek 	int l;
106*b636d99dSDavid van Moolenbroek 	l = ND_PRINT((ndo, "%s/%d", ip6addr_string(ndo, &ni->rip6_dest), ni->rip6_plen));
107*b636d99dSDavid van Moolenbroek 	if (ni->rip6_tag)
108*b636d99dSDavid van Moolenbroek 		l += ND_PRINT((ndo, " [%d]", EXTRACT_16BITS(&ni->rip6_tag)));
109*b636d99dSDavid van Moolenbroek 	if (metric)
110*b636d99dSDavid van Moolenbroek 		l += ND_PRINT((ndo, " (%d)", ni->rip6_metric));
111*b636d99dSDavid van Moolenbroek 	return l;
112*b636d99dSDavid van Moolenbroek }
113*b636d99dSDavid van Moolenbroek 
114*b636d99dSDavid van Moolenbroek void
ripng_print(netdissect_options * ndo,const u_char * dat,unsigned int length)115*b636d99dSDavid van Moolenbroek ripng_print(netdissect_options *ndo, const u_char *dat, unsigned int length)
116*b636d99dSDavid van Moolenbroek {
117*b636d99dSDavid van Moolenbroek 	register const struct rip6 *rp = (struct rip6 *)dat;
118*b636d99dSDavid van Moolenbroek 	register const struct netinfo6 *ni;
119*b636d99dSDavid van Moolenbroek 	register u_int amt;
120*b636d99dSDavid van Moolenbroek 	register u_int i;
121*b636d99dSDavid van Moolenbroek 	int j;
122*b636d99dSDavid van Moolenbroek 	int trunc;
123*b636d99dSDavid van Moolenbroek 
124*b636d99dSDavid van Moolenbroek 	if (ndo->ndo_snapend < dat)
125*b636d99dSDavid van Moolenbroek 		return;
126*b636d99dSDavid van Moolenbroek 	amt = ndo->ndo_snapend - dat;
127*b636d99dSDavid van Moolenbroek 	i = min(length, amt);
128*b636d99dSDavid van Moolenbroek 	if (i < (sizeof(struct rip6) - sizeof(struct netinfo6)))
129*b636d99dSDavid van Moolenbroek 		return;
130*b636d99dSDavid van Moolenbroek 	i -= (sizeof(struct rip6) - sizeof(struct netinfo6));
131*b636d99dSDavid van Moolenbroek 
132*b636d99dSDavid van Moolenbroek 	switch (rp->rip6_cmd) {
133*b636d99dSDavid van Moolenbroek 
134*b636d99dSDavid van Moolenbroek 	case RIP6_REQUEST:
135*b636d99dSDavid van Moolenbroek 		j = length / sizeof(*ni);
136*b636d99dSDavid van Moolenbroek 		if (j == 1
137*b636d99dSDavid van Moolenbroek 		    &&  rp->rip6_nets->rip6_metric == HOPCNT_INFINITY6
138*b636d99dSDavid van Moolenbroek 		    &&  IN6_IS_ADDR_UNSPECIFIED(&rp->rip6_nets->rip6_dest)) {
139*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " ripng-req dump"));
140*b636d99dSDavid van Moolenbroek 			break;
141*b636d99dSDavid van Moolenbroek 		}
142*b636d99dSDavid van Moolenbroek 		if (j * sizeof(*ni) != length - 4)
143*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " ripng-req %d[%u]:", j, length));
144*b636d99dSDavid van Moolenbroek 		else
145*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " ripng-req %d:", j));
146*b636d99dSDavid van Moolenbroek 		trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
147*b636d99dSDavid van Moolenbroek 		for (ni = rp->rip6_nets; i >= sizeof(*ni);
148*b636d99dSDavid van Moolenbroek 		    i -= sizeof(*ni), ++ni) {
149*b636d99dSDavid van Moolenbroek 			if (ndo->ndo_vflag > 1)
150*b636d99dSDavid van Moolenbroek 				ND_PRINT((ndo, "\n\t"));
151*b636d99dSDavid van Moolenbroek 			else
152*b636d99dSDavid van Moolenbroek 				ND_PRINT((ndo, " "));
153*b636d99dSDavid van Moolenbroek 			rip6_entry_print(ndo, ni, 0);
154*b636d99dSDavid van Moolenbroek 		}
155*b636d99dSDavid van Moolenbroek 		break;
156*b636d99dSDavid van Moolenbroek 	case RIP6_RESPONSE:
157*b636d99dSDavid van Moolenbroek 		j = length / sizeof(*ni);
158*b636d99dSDavid van Moolenbroek 		if (j * sizeof(*ni) != length - 4)
159*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " ripng-resp %d[%u]:", j, length));
160*b636d99dSDavid van Moolenbroek 		else
161*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " ripng-resp %d:", j));
162*b636d99dSDavid van Moolenbroek 		trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
163*b636d99dSDavid van Moolenbroek 		for (ni = rp->rip6_nets; i >= sizeof(*ni);
164*b636d99dSDavid van Moolenbroek 		    i -= sizeof(*ni), ++ni) {
165*b636d99dSDavid van Moolenbroek 			if (ndo->ndo_vflag > 1)
166*b636d99dSDavid van Moolenbroek 				ND_PRINT((ndo, "\n\t"));
167*b636d99dSDavid van Moolenbroek 			else
168*b636d99dSDavid van Moolenbroek 				ND_PRINT((ndo, " "));
169*b636d99dSDavid van Moolenbroek 			rip6_entry_print(ndo, ni, ni->rip6_metric);
170*b636d99dSDavid van Moolenbroek 		}
171*b636d99dSDavid van Moolenbroek 		if (trunc)
172*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, "[|ripng]"));
173*b636d99dSDavid van Moolenbroek 		break;
174*b636d99dSDavid van Moolenbroek 	default:
175*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " ripng-%d ?? %u", rp->rip6_cmd, length));
176*b636d99dSDavid van Moolenbroek 		break;
177*b636d99dSDavid van Moolenbroek 	}
178*b636d99dSDavid van Moolenbroek 	if (rp->rip6_vers != RIP6_VERSION)
179*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " [vers %d]", rp->rip6_vers));
180*b636d99dSDavid van Moolenbroek }
181*b636d99dSDavid van Moolenbroek #endif /* INET6 */
182