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