blob: c4f4ea3a1db2178d1ec4d35546f9f82704551812 [file] [log] [blame]
The Android Open Source Project2949f582009-03-03 19:30:46 -08001/*
2 * Copyright (c) 1989, 1990, 1991, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that: (1) source code distributions
7 * retain the above copyright notice and this paragraph in its entirety, (2)
8 * distributions including binary code include the above copyright notice and
9 * this paragraph in its entirety in the documentation or other materials
10 * provided with the distribution, and (3) all advertising materials mentioning
11 * features or use of this software display the following acknowledgement:
12 * ``This product includes software developed by the University of California,
13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14 * the University nor the names of its contributors may be used to endorse
15 * or promote products derived from this software without specific prior
16 * written permission.
17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 */
21
Elliott Hughese2e3bd12017-05-15 10:59:29 -070022/* \summary: IPv6 Routing Information Protocol (RIPng) printer */
23
Elliott Hughes820eced2021-08-20 18:00:50 -070024/* specification: RFC 2080 */
25
The Android Open Source Project2949f582009-03-03 19:30:46 -080026#ifdef HAVE_CONFIG_H
Elliott Hughes820eced2021-08-20 18:00:50 -070027#include <config.h>
The Android Open Source Project2949f582009-03-03 19:30:46 -080028#endif
29
Elliott Hughes820eced2021-08-20 18:00:50 -070030#include "netdissect-stdinc.h"
The Android Open Source Project2949f582009-03-03 19:30:46 -080031
Elliott Hughese2e3bd12017-05-15 10:59:29 -070032#include "netdissect.h"
The Android Open Source Project2949f582009-03-03 19:30:46 -080033#include "addrtoname.h"
34#include "extract.h"
35
Elliott Hughes892a68b2015-10-19 14:43:53 -070036/*
37 * Copyright (C) 1995, 1996, 1997 and 1998 WIDE Project.
38 * All rights reserved.
39 *
40 * Redistribution and use in source and binary forms, with or without
41 * modification, are permitted provided that the following conditions
42 * are met:
43 * 1. Redistributions of source code must retain the above copyright
44 * notice, this list of conditions and the following disclaimer.
45 * 2. Redistributions in binary form must reproduce the above copyright
46 * notice, this list of conditions and the following disclaimer in the
47 * documentation and/or other materials provided with the distribution.
48 * 3. Neither the name of the project nor the names of its contributors
49 * may be used to endorse or promote products derived from this software
50 * without specific prior written permission.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * SUCH DAMAGE.
63 */
64#define RIP6_VERSION 1
65
66#define RIP6_REQUEST 1
67#define RIP6_RESPONSE 2
68
69struct netinfo6 {
Elliott Hughes820eced2021-08-20 18:00:50 -070070 nd_ipv6 rip6_dest;
71 nd_uint16_t rip6_tag;
72 nd_uint8_t rip6_plen;
73 nd_uint8_t rip6_metric;
Elliott Hughes892a68b2015-10-19 14:43:53 -070074};
75
76struct rip6 {
Elliott Hughes820eced2021-08-20 18:00:50 -070077 nd_uint8_t rip6_cmd;
78 nd_uint8_t rip6_vers;
79 nd_byte rip6_res1[2];
80 struct netinfo6 rip6_nets[1];
Elliott Hughes892a68b2015-10-19 14:43:53 -070081};
82
83#define HOPCNT_INFINITY6 16
84
Elliott Hughes820eced2021-08-20 18:00:50 -070085static int ND_IN6_IS_ADDR_UNSPECIFIED(const nd_ipv6 *addr)
The Android Open Source Project2949f582009-03-03 19:30:46 -080086{
Elliott Hughes820eced2021-08-20 18:00:50 -070087 static const nd_ipv6 in6addr_any_val = { 0 }; /* :: */
88 return (memcmp(addr, &in6addr_any_val, sizeof(*addr)) == 0);
The Android Open Source Project2949f582009-03-03 19:30:46 -080089}
The Android Open Source Project2949f582009-03-03 19:30:46 -080090
Elliott Hughes820eced2021-08-20 18:00:50 -070091static void
92rip6_entry_print(netdissect_options *ndo,
93 const struct netinfo6 *ni, const u_int print_metric)
The Android Open Source Project2949f582009-03-03 19:30:46 -080094{
Elliott Hughes820eced2021-08-20 18:00:50 -070095 uint16_t tag;
96 uint8_t metric;
97
98 ND_PRINT("%s/%u", GET_IP6ADDR_STRING(ni->rip6_dest),
99 GET_U_1(ni->rip6_plen));
100 tag = GET_BE_U_2(ni->rip6_tag);
101 if (tag)
102 ND_PRINT(" [%u]", tag);
103 metric = GET_U_1(ni->rip6_metric);
104 if (metric && print_metric)
105 ND_PRINT(" (%u)", metric);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800106}
107
108void
Elliott Hughes892a68b2015-10-19 14:43:53 -0700109ripng_print(netdissect_options *ndo, const u_char *dat, unsigned int length)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800110{
Elliott Hughes820eced2021-08-20 18:00:50 -0700111 const struct rip6 *rp = (const struct rip6 *)dat;
112 uint8_t cmd, vers;
113 const struct netinfo6 *ni;
Elliott Hughescec480a2017-12-19 16:54:57 -0800114 unsigned int length_left;
115 u_int j;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800116
Elliott Hughes820eced2021-08-20 18:00:50 -0700117 ndo->ndo_protocol = "ripng";
118 vers = GET_U_1(rp->rip6_vers);
119 if (vers != RIP6_VERSION) {
120 ND_PRINT(" [vers %u]", vers);
121 goto invalid;
122 }
123 cmd = GET_U_1(rp->rip6_cmd);
124 switch (cmd) {
The Android Open Source Project2949f582009-03-03 19:30:46 -0800125
126 case RIP6_REQUEST:
Elliott Hughescec480a2017-12-19 16:54:57 -0800127 length_left = length;
128 if (length_left < (sizeof(struct rip6) - sizeof(struct netinfo6)))
Elliott Hughes820eced2021-08-20 18:00:50 -0700129 goto invalid;
Elliott Hughescec480a2017-12-19 16:54:57 -0800130 length_left -= (sizeof(struct rip6) - sizeof(struct netinfo6));
131 j = length_left / sizeof(*ni);
132 if (j == 1) {
Elliott Hughes820eced2021-08-20 18:00:50 -0700133 if (GET_U_1(rp->rip6_nets->rip6_metric) == HOPCNT_INFINITY6
134 && ND_IN6_IS_ADDR_UNSPECIFIED(&rp->rip6_nets->rip6_dest)) {
135 ND_PRINT(" ripng-req dump");
Elliott Hughescec480a2017-12-19 16:54:57 -0800136 break;
137 }
The Android Open Source Project2949f582009-03-03 19:30:46 -0800138 }
Elliott Hughescec480a2017-12-19 16:54:57 -0800139 if (j * sizeof(*ni) != length_left)
Elliott Hughes820eced2021-08-20 18:00:50 -0700140 ND_PRINT(" ripng-req %u[%u]:", j, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800141 else
Elliott Hughes820eced2021-08-20 18:00:50 -0700142 ND_PRINT(" ripng-req %u:", j);
Elliott Hughescec480a2017-12-19 16:54:57 -0800143 for (ni = rp->rip6_nets; length_left >= sizeof(*ni);
144 length_left -= sizeof(*ni), ++ni) {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700145 if (ndo->ndo_vflag > 1)
Elliott Hughes820eced2021-08-20 18:00:50 -0700146 ND_PRINT("\n\t");
The Android Open Source Project2949f582009-03-03 19:30:46 -0800147 else
Elliott Hughes820eced2021-08-20 18:00:50 -0700148 ND_PRINT(" ");
149 rip6_entry_print(ndo, ni, FALSE);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800150 }
Elliott Hughescec480a2017-12-19 16:54:57 -0800151 if (length_left != 0)
Elliott Hughes820eced2021-08-20 18:00:50 -0700152 goto invalid;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800153 break;
154 case RIP6_RESPONSE:
Elliott Hughescec480a2017-12-19 16:54:57 -0800155 length_left = length;
156 if (length_left < (sizeof(struct rip6) - sizeof(struct netinfo6)))
Elliott Hughes820eced2021-08-20 18:00:50 -0700157 goto invalid;
Elliott Hughescec480a2017-12-19 16:54:57 -0800158 length_left -= (sizeof(struct rip6) - sizeof(struct netinfo6));
159 j = length_left / sizeof(*ni);
160 if (j * sizeof(*ni) != length_left)
Elliott Hughes820eced2021-08-20 18:00:50 -0700161 ND_PRINT(" ripng-resp %u[%u]:", j, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800162 else
Elliott Hughes820eced2021-08-20 18:00:50 -0700163 ND_PRINT(" ripng-resp %u:", j);
Elliott Hughescec480a2017-12-19 16:54:57 -0800164 for (ni = rp->rip6_nets; length_left >= sizeof(*ni);
165 length_left -= sizeof(*ni), ++ni) {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700166 if (ndo->ndo_vflag > 1)
Elliott Hughes820eced2021-08-20 18:00:50 -0700167 ND_PRINT("\n\t");
The Android Open Source Project2949f582009-03-03 19:30:46 -0800168 else
Elliott Hughes820eced2021-08-20 18:00:50 -0700169 ND_PRINT(" ");
170 rip6_entry_print(ndo, ni, TRUE);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800171 }
Elliott Hughescec480a2017-12-19 16:54:57 -0800172 if (length_left != 0)
Elliott Hughes820eced2021-08-20 18:00:50 -0700173 goto invalid;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800174 break;
175 default:
Elliott Hughes820eced2021-08-20 18:00:50 -0700176 ND_PRINT(" ripng-%u ?? %u", cmd, length);
177 goto invalid;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800178 }
Elliott Hughescec480a2017-12-19 16:54:57 -0800179 return;
180
Elliott Hughes820eced2021-08-20 18:00:50 -0700181invalid:
182 nd_print_invalid(ndo);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800183}