141c99275SPeter Avalos /*
241c99275SPeter Avalos * Copyright (c) 1989, 1990, 1991, 1993, 1994, 1996
341c99275SPeter Avalos * The Regents of the University of California. All rights reserved.
441c99275SPeter Avalos *
541c99275SPeter Avalos * Redistribution and use in source and binary forms, with or without
641c99275SPeter Avalos * modification, are permitted provided that: (1) source code distributions
741c99275SPeter Avalos * retain the above copyright notice and this paragraph in its entirety, (2)
841c99275SPeter Avalos * distributions including binary code include the above copyright notice and
941c99275SPeter Avalos * this paragraph in its entirety in the documentation or other materials
1041c99275SPeter Avalos * provided with the distribution, and (3) all advertising materials mentioning
1141c99275SPeter Avalos * features or use of this software display the following acknowledgement:
1241c99275SPeter Avalos * ``This product includes software developed by the University of California,
1341c99275SPeter Avalos * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
1441c99275SPeter Avalos * the University nor the names of its contributors may be used to endorse
1541c99275SPeter Avalos * or promote products derived from this software without specific prior
1641c99275SPeter Avalos * written permission.
1741c99275SPeter Avalos * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
1841c99275SPeter Avalos * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
1941c99275SPeter Avalos * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2041c99275SPeter Avalos */
2141c99275SPeter Avalos
22411677aeSAaron LI /* \summary: Routing Information Protocol (RIP) printer */
2341c99275SPeter Avalos
24*ed775ee7SAntonio Huete Jimenez /* specification: RFC 1058, RFC 2453, RFC 4822 */
25*ed775ee7SAntonio Huete Jimenez
2641c99275SPeter Avalos #ifdef HAVE_CONFIG_H
27*ed775ee7SAntonio Huete Jimenez #include <config.h>
2841c99275SPeter Avalos #endif
2941c99275SPeter Avalos
30*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
3141c99275SPeter Avalos
32411677aeSAaron LI #include "netdissect.h"
3341c99275SPeter Avalos #include "addrtoname.h"
34411677aeSAaron LI #include "extract.h"
3541c99275SPeter Avalos
36ea7b4bf5SPeter Avalos #include "af.h"
37ea7b4bf5SPeter Avalos
38411677aeSAaron LI
39*ed775ee7SAntonio Huete Jimenez /*
40*ed775ee7SAntonio Huete Jimenez * RFC 1058 and RFC 2453 header of packet.
41*ed775ee7SAntonio Huete Jimenez *
42*ed775ee7SAntonio Huete Jimenez * 0 1 2 3 3
43*ed775ee7SAntonio Huete Jimenez * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
44*ed775ee7SAntonio Huete Jimenez * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45*ed775ee7SAntonio Huete Jimenez * | Command (1) | Version (1) | unused |
46*ed775ee7SAntonio Huete Jimenez * +---------------+---------------+-------------------------------+
47*ed775ee7SAntonio Huete Jimenez */
4841c99275SPeter Avalos struct rip {
49*ed775ee7SAntonio Huete Jimenez nd_uint8_t rip_cmd; /* request/response */
50*ed775ee7SAntonio Huete Jimenez nd_uint8_t rip_vers; /* protocol version # */
51*ed775ee7SAntonio Huete Jimenez nd_byte unused[2]; /* unused */
5241c99275SPeter Avalos };
5341c99275SPeter Avalos
5441c99275SPeter Avalos #define RIPCMD_REQUEST 1 /* want info */
5541c99275SPeter Avalos #define RIPCMD_RESPONSE 2 /* responding to request */
5641c99275SPeter Avalos #define RIPCMD_TRACEON 3 /* turn tracing on */
5741c99275SPeter Avalos #define RIPCMD_TRACEOFF 4 /* turn it off */
5841c99275SPeter Avalos #define RIPCMD_POLL 5 /* want info from everybody */
5941c99275SPeter Avalos #define RIPCMD_POLLENTRY 6 /* poll for entry */
6041c99275SPeter Avalos
6141c99275SPeter Avalos static const struct tok rip_cmd_values[] = {
6241c99275SPeter Avalos { RIPCMD_REQUEST, "Request" },
6341c99275SPeter Avalos { RIPCMD_RESPONSE, "Response" },
6441c99275SPeter Avalos { RIPCMD_TRACEON, "Trace on" },
6541c99275SPeter Avalos { RIPCMD_TRACEOFF, "Trace off" },
6641c99275SPeter Avalos { RIPCMD_POLL, "Poll" },
6741c99275SPeter Avalos { RIPCMD_POLLENTRY, "Poll Entry" },
6841c99275SPeter Avalos { 0, NULL}
6941c99275SPeter Avalos };
7041c99275SPeter Avalos
7141c99275SPeter Avalos #define RIP_AUTHLEN 16
7241c99275SPeter Avalos #define RIP_ROUTELEN 20
7341c99275SPeter Avalos
7441c99275SPeter Avalos /*
75*ed775ee7SAntonio Huete Jimenez * First 4 bytes of all RIPv1/RIPv2 entries.
76*ed775ee7SAntonio Huete Jimenez */
77*ed775ee7SAntonio Huete Jimenez struct rip_entry_header {
78*ed775ee7SAntonio Huete Jimenez nd_uint16_t rip_family;
79*ed775ee7SAntonio Huete Jimenez nd_uint16_t rip_tag;
80*ed775ee7SAntonio Huete Jimenez };
81*ed775ee7SAntonio Huete Jimenez
82*ed775ee7SAntonio Huete Jimenez /*
83*ed775ee7SAntonio Huete Jimenez * RFC 1058 entry.
8441c99275SPeter Avalos *
8541c99275SPeter Avalos * 0 1 2 3 3
8641c99275SPeter Avalos * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
8741c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
88*ed775ee7SAntonio Huete Jimenez * | Address Family Identifier (2) | must be zero (2) |
89*ed775ee7SAntonio Huete Jimenez * +-------------------------------+-------------------------------+
90*ed775ee7SAntonio Huete Jimenez * | IP Address (4) |
91*ed775ee7SAntonio Huete Jimenez * +---------------------------------------------------------------+
92*ed775ee7SAntonio Huete Jimenez * | must be zero (4) |
93*ed775ee7SAntonio Huete Jimenez * +---------------------------------------------------------------+
94*ed775ee7SAntonio Huete Jimenez * | must be zero (4) |
95*ed775ee7SAntonio Huete Jimenez * +---------------------------------------------------------------+
96*ed775ee7SAntonio Huete Jimenez * | Metric (4) |
97*ed775ee7SAntonio Huete Jimenez * +---------------------------------------------------------------+
98*ed775ee7SAntonio Huete Jimenez */
99*ed775ee7SAntonio Huete Jimenez struct rip_netinfo_v1 {
100*ed775ee7SAntonio Huete Jimenez nd_uint16_t rip_family;
101*ed775ee7SAntonio Huete Jimenez nd_byte rip_mbz1[2];
102*ed775ee7SAntonio Huete Jimenez nd_ipv4 rip_dest;
103*ed775ee7SAntonio Huete Jimenez nd_byte rip_mbz2[4];
104*ed775ee7SAntonio Huete Jimenez nd_byte rip_mbz3[4];
105*ed775ee7SAntonio Huete Jimenez nd_uint32_t rip_metric; /* cost of route */
106*ed775ee7SAntonio Huete Jimenez };
107*ed775ee7SAntonio Huete Jimenez
108*ed775ee7SAntonio Huete Jimenez
109*ed775ee7SAntonio Huete Jimenez /*
110*ed775ee7SAntonio Huete Jimenez * RFC 2453 route entry
111*ed775ee7SAntonio Huete Jimenez *
112*ed775ee7SAntonio Huete Jimenez * 0 1 2 3 3
113*ed775ee7SAntonio Huete Jimenez * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
114*ed775ee7SAntonio Huete Jimenez * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
11541c99275SPeter Avalos * | Address Family Identifier (2) | Route Tag (2) |
11641c99275SPeter Avalos * +-------------------------------+-------------------------------+
11741c99275SPeter Avalos * | IP Address (4) |
11841c99275SPeter Avalos * +---------------------------------------------------------------+
11941c99275SPeter Avalos * | Subnet Mask (4) |
12041c99275SPeter Avalos * +---------------------------------------------------------------+
12141c99275SPeter Avalos * | Next Hop (4) |
12241c99275SPeter Avalos * +---------------------------------------------------------------+
12341c99275SPeter Avalos * | Metric (4) |
12441c99275SPeter Avalos * +---------------------------------------------------------------+
12541c99275SPeter Avalos *
12641c99275SPeter Avalos */
12741c99275SPeter Avalos
128*ed775ee7SAntonio Huete Jimenez struct rip_netinfo_v2 {
129*ed775ee7SAntonio Huete Jimenez nd_uint16_t rip_family;
130*ed775ee7SAntonio Huete Jimenez nd_uint16_t rip_tag;
131*ed775ee7SAntonio Huete Jimenez nd_ipv4 rip_dest;
132*ed775ee7SAntonio Huete Jimenez nd_uint32_t rip_dest_mask;
133*ed775ee7SAntonio Huete Jimenez nd_ipv4 rip_router;
134*ed775ee7SAntonio Huete Jimenez nd_uint32_t rip_metric; /* cost of route */
13541c99275SPeter Avalos };
13641c99275SPeter Avalos
137*ed775ee7SAntonio Huete Jimenez /*
138*ed775ee7SAntonio Huete Jimenez * RFC 2453 authentication entry
139*ed775ee7SAntonio Huete Jimenez *
140*ed775ee7SAntonio Huete Jimenez * 0 1 2 3 3
141*ed775ee7SAntonio Huete Jimenez * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
142*ed775ee7SAntonio Huete Jimenez * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
143*ed775ee7SAntonio Huete Jimenez * | 0xFFFF | Authentication Type (2) |
144*ed775ee7SAntonio Huete Jimenez * +-------------------------------+-------------------------------+
145*ed775ee7SAntonio Huete Jimenez * - Authentication (16) -
146*ed775ee7SAntonio Huete Jimenez * +---------------------------------------------------------------+
147*ed775ee7SAntonio Huete Jimenez */
148*ed775ee7SAntonio Huete Jimenez
149*ed775ee7SAntonio Huete Jimenez struct rip_auth_v2 {
150*ed775ee7SAntonio Huete Jimenez nd_uint16_t rip_family;
151*ed775ee7SAntonio Huete Jimenez nd_uint16_t rip_tag;
152*ed775ee7SAntonio Huete Jimenez nd_byte rip_auth[16];
153*ed775ee7SAntonio Huete Jimenez };
154*ed775ee7SAntonio Huete Jimenez
155*ed775ee7SAntonio Huete Jimenez /*
156*ed775ee7SAntonio Huete Jimenez * RFC 4822 Cryptographic Authentication entry.
157*ed775ee7SAntonio Huete Jimenez *
158*ed775ee7SAntonio Huete Jimenez * 0 1 2 3 3
159*ed775ee7SAntonio Huete Jimenez * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
160*ed775ee7SAntonio Huete Jimenez * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
161*ed775ee7SAntonio Huete Jimenez * | RIPv2 Packet Length | Key ID | Auth Data Len |
162*ed775ee7SAntonio Huete Jimenez * +---------------+---------------+---------------+---------------+
163*ed775ee7SAntonio Huete Jimenez * | Sequence Number (non-decreasing) |
164*ed775ee7SAntonio Huete Jimenez * +---------------+---------------+---------------+---------------+
165*ed775ee7SAntonio Huete Jimenez * | reserved must be zero |
166*ed775ee7SAntonio Huete Jimenez * +---------------+---------------+---------------+---------------+
167*ed775ee7SAntonio Huete Jimenez * | reserved must be zero |
168*ed775ee7SAntonio Huete Jimenez * +---------------+---------------+---------------+---------------+
169*ed775ee7SAntonio Huete Jimenez */
170*ed775ee7SAntonio Huete Jimenez struct rip_auth_crypto_v2 {
171*ed775ee7SAntonio Huete Jimenez nd_uint16_t rip_packet_len;
172*ed775ee7SAntonio Huete Jimenez nd_uint8_t rip_key_id;
173*ed775ee7SAntonio Huete Jimenez nd_uint8_t rip_auth_data_len;
174*ed775ee7SAntonio Huete Jimenez nd_uint32_t rip_seq_num;
175*ed775ee7SAntonio Huete Jimenez nd_byte rip_mbz1[4];
176*ed775ee7SAntonio Huete Jimenez nd_byte rip_mbz2[4];
177*ed775ee7SAntonio Huete Jimenez };
178*ed775ee7SAntonio Huete Jimenez
179*ed775ee7SAntonio Huete Jimenez static unsigned
rip_entry_print_v1(netdissect_options * ndo,const u_char * p,unsigned remaining)180*ed775ee7SAntonio Huete Jimenez rip_entry_print_v1(netdissect_options *ndo, const u_char *p,
181*ed775ee7SAntonio Huete Jimenez unsigned remaining)
18241c99275SPeter Avalos {
183*ed775ee7SAntonio Huete Jimenez const struct rip_entry_header *eh = (const struct rip_entry_header *)p;
184*ed775ee7SAntonio Huete Jimenez u_short family;
185*ed775ee7SAntonio Huete Jimenez const struct rip_netinfo_v1 *ni = (const struct rip_netinfo_v1 *)p;
18641c99275SPeter Avalos
18741c99275SPeter Avalos /* RFC 1058 */
188*ed775ee7SAntonio Huete Jimenez if (remaining < RIP_ROUTELEN)
189*ed775ee7SAntonio Huete Jimenez return (0);
190*ed775ee7SAntonio Huete Jimenez ND_TCHECK_SIZE(ni);
191*ed775ee7SAntonio Huete Jimenez family = GET_BE_U_2(ni->rip_family);
192411677aeSAaron LI if (family != BSD_AFNUM_INET && family != 0) {
193*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t AFI %s, ", tok2str(bsd_af_values, "Unknown (%u)", family));
194*ed775ee7SAntonio Huete Jimenez print_unknown_data(ndo, p + sizeof(*eh), "\n\t ", RIP_ROUTELEN - sizeof(*eh));
195*ed775ee7SAntonio Huete Jimenez return (RIP_ROUTELEN);
19641c99275SPeter Avalos }
197*ed775ee7SAntonio Huete Jimenez if (GET_BE_U_2(ni->rip_mbz1) ||
198*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(ni->rip_mbz2) ||
199*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(ni->rip_mbz3)) {
20041c99275SPeter Avalos /* MBZ fields not zero */
201*ed775ee7SAntonio Huete Jimenez print_unknown_data(ndo, p, "\n\t ", RIP_ROUTELEN);
202*ed775ee7SAntonio Huete Jimenez return (RIP_ROUTELEN);
203411677aeSAaron LI }
204411677aeSAaron LI if (family == 0) {
205*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t AFI 0, %s, metric: %u",
206*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(ni->rip_dest),
207*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(ni->rip_metric));
208*ed775ee7SAntonio Huete Jimenez return (RIP_ROUTELEN);
209ea7b4bf5SPeter Avalos } /* BSD_AFNUM_INET */
210*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t %s, metric: %u",
211*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(ni->rip_dest),
212*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(ni->rip_metric));
213*ed775ee7SAntonio Huete Jimenez return (RIP_ROUTELEN);
214*ed775ee7SAntonio Huete Jimenez trunc:
215*ed775ee7SAntonio Huete Jimenez return 0;
21641c99275SPeter Avalos }
21741c99275SPeter Avalos
218411677aeSAaron LI static unsigned
rip_entry_print_v2(netdissect_options * ndo,const u_char * p,unsigned remaining)219*ed775ee7SAntonio Huete Jimenez rip_entry_print_v2(netdissect_options *ndo, const u_char *p,
220*ed775ee7SAntonio Huete Jimenez unsigned remaining)
22141c99275SPeter Avalos {
222*ed775ee7SAntonio Huete Jimenez const struct rip_entry_header *eh = (const struct rip_entry_header *)p;
223*ed775ee7SAntonio Huete Jimenez u_short family;
224*ed775ee7SAntonio Huete Jimenez const struct rip_netinfo_v2 *ni;
22541c99275SPeter Avalos
226*ed775ee7SAntonio Huete Jimenez if (remaining < sizeof(*eh))
227*ed775ee7SAntonio Huete Jimenez return (0);
228*ed775ee7SAntonio Huete Jimenez ND_TCHECK_SIZE(eh);
229*ed775ee7SAntonio Huete Jimenez family = GET_BE_U_2(eh->rip_family);
230411677aeSAaron LI if (family == 0xFFFF) { /* variable-sized authentication structures */
231*ed775ee7SAntonio Huete Jimenez uint16_t auth_type = GET_BE_U_2(eh->rip_tag);
232*ed775ee7SAntonio Huete Jimenez
233*ed775ee7SAntonio Huete Jimenez p += sizeof(*eh);
234*ed775ee7SAntonio Huete Jimenez remaining -= sizeof(*eh);
235411677aeSAaron LI if (auth_type == 2) {
236*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t Simple Text Authentication data: ");
237*ed775ee7SAntonio Huete Jimenez nd_printjnp(ndo, p, RIP_AUTHLEN);
238411677aeSAaron LI } else if (auth_type == 3) {
239*ed775ee7SAntonio Huete Jimenez const struct rip_auth_crypto_v2 *ch;
240*ed775ee7SAntonio Huete Jimenez
241*ed775ee7SAntonio Huete Jimenez ch = (const struct rip_auth_crypto_v2 *)p;
242*ed775ee7SAntonio Huete Jimenez ND_TCHECK_SIZE(ch);
243*ed775ee7SAntonio Huete Jimenez if (remaining < sizeof(*ch))
244*ed775ee7SAntonio Huete Jimenez return (0);
245*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t Auth header:");
246*ed775ee7SAntonio Huete Jimenez ND_PRINT(" Packet Len %u,",
247*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(ch->rip_packet_len));
248*ed775ee7SAntonio Huete Jimenez ND_PRINT(" Key-ID %u,", GET_U_1(ch->rip_key_id));
249*ed775ee7SAntonio Huete Jimenez ND_PRINT(" Auth Data Len %u,",
250*ed775ee7SAntonio Huete Jimenez GET_U_1(ch->rip_auth_data_len));
251*ed775ee7SAntonio Huete Jimenez ND_PRINT(" SeqNo %u,", GET_BE_U_4(ch->rip_seq_num));
252*ed775ee7SAntonio Huete Jimenez ND_PRINT(" MBZ %u,", GET_BE_U_4(ch->rip_mbz1));
253*ed775ee7SAntonio Huete Jimenez ND_PRINT(" MBZ %u", GET_BE_U_4(ch->rip_mbz2));
254411677aeSAaron LI } else if (auth_type == 1) {
255*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t Auth trailer:");
256*ed775ee7SAntonio Huete Jimenez print_unknown_data(ndo, p, "\n\t ", remaining);
257*ed775ee7SAntonio Huete Jimenez return (sizeof(*eh) + remaining); /* AT spans till the packet end */
25841c99275SPeter Avalos } else {
259*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t Unknown (%u) Authentication data:",
260*ed775ee7SAntonio Huete Jimenez auth_type);
261*ed775ee7SAntonio Huete Jimenez print_unknown_data(ndo, p, "\n\t ", remaining);
262*ed775ee7SAntonio Huete Jimenez return (sizeof(*eh) + remaining); /* we don't know how long this is, so we go to the packet end */
26341c99275SPeter Avalos }
264411677aeSAaron LI } else if (family != BSD_AFNUM_INET && family != 0) {
265*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t AFI %s", tok2str(bsd_af_values, "Unknown (%u)", family));
266*ed775ee7SAntonio Huete Jimenez print_unknown_data(ndo, p + sizeof(*eh), "\n\t ", RIP_ROUTELEN - sizeof(*eh));
267411677aeSAaron LI } else { /* BSD_AFNUM_INET or AFI 0 */
268*ed775ee7SAntonio Huete Jimenez ni = (const struct rip_netinfo_v2 *)p;
269*ed775ee7SAntonio Huete Jimenez ND_TCHECK_SIZE(ni);
270*ed775ee7SAntonio Huete Jimenez if (remaining < sizeof(*ni))
271*ed775ee7SAntonio Huete Jimenez return (0);
272*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t AFI %s, %15s/%-2d, tag 0x%04x, metric: %u, next-hop: ",
273411677aeSAaron LI tok2str(bsd_af_values, "%u", family),
274*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(ni->rip_dest),
275*ed775ee7SAntonio Huete Jimenez mask2plen(GET_BE_U_4(ni->rip_dest_mask)),
276*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(ni->rip_tag),
277*ed775ee7SAntonio Huete Jimenez GET_BE_U_4(ni->rip_metric));
278*ed775ee7SAntonio Huete Jimenez if (GET_BE_U_4(ni->rip_router))
279*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s", GET_IPADDR_STRING(ni->rip_router));
28041c99275SPeter Avalos else
281*ed775ee7SAntonio Huete Jimenez ND_PRINT("self");
28241c99275SPeter Avalos }
283*ed775ee7SAntonio Huete Jimenez return (RIP_ROUTELEN);
284*ed775ee7SAntonio Huete Jimenez trunc:
285*ed775ee7SAntonio Huete Jimenez return 0;
28641c99275SPeter Avalos }
28741c99275SPeter Avalos
28841c99275SPeter Avalos void
rip_print(netdissect_options * ndo,const u_char * dat,u_int length)289411677aeSAaron LI rip_print(netdissect_options *ndo,
290411677aeSAaron LI const u_char *dat, u_int length)
29141c99275SPeter Avalos {
292*ed775ee7SAntonio Huete Jimenez const struct rip *rp;
293*ed775ee7SAntonio Huete Jimenez uint8_t vers, cmd;
294*ed775ee7SAntonio Huete Jimenez const u_char *p;
295*ed775ee7SAntonio Huete Jimenez u_int len, routecount;
296*ed775ee7SAntonio Huete Jimenez unsigned entry_size;
29741c99275SPeter Avalos
298*ed775ee7SAntonio Huete Jimenez ndo->ndo_protocol = "rip";
299411677aeSAaron LI if (ndo->ndo_snapend < dat) {
300*ed775ee7SAntonio Huete Jimenez nd_print_trunc(ndo);
30141c99275SPeter Avalos return;
30241c99275SPeter Avalos }
303*ed775ee7SAntonio Huete Jimenez len = ND_BYTES_AVAILABLE_AFTER(dat);
304*ed775ee7SAntonio Huete Jimenez if (len > length)
305*ed775ee7SAntonio Huete Jimenez len = length;
306*ed775ee7SAntonio Huete Jimenez if (len < sizeof(*rp)) {
307*ed775ee7SAntonio Huete Jimenez nd_print_trunc(ndo);
30841c99275SPeter Avalos return;
30941c99275SPeter Avalos }
310*ed775ee7SAntonio Huete Jimenez len -= sizeof(*rp);
31141c99275SPeter Avalos
312411677aeSAaron LI rp = (const struct rip *)dat;
31341c99275SPeter Avalos
314*ed775ee7SAntonio Huete Jimenez ND_TCHECK_SIZE(rp);
315*ed775ee7SAntonio Huete Jimenez vers = GET_U_1(rp->rip_vers);
316*ed775ee7SAntonio Huete Jimenez ND_PRINT("%sRIPv%u",
317411677aeSAaron LI (ndo->ndo_vflag >= 1) ? "\n\t" : "",
318*ed775ee7SAntonio Huete Jimenez vers);
31941c99275SPeter Avalos
320*ed775ee7SAntonio Huete Jimenez if (vers == 0) {
32141c99275SPeter Avalos /*
32241c99275SPeter Avalos * RFC 1058.
32341c99275SPeter Avalos *
32441c99275SPeter Avalos * XXX - RFC 1058 says
32541c99275SPeter Avalos *
32641c99275SPeter Avalos * 0 Datagrams whose version number is zero are to be ignored.
32741c99275SPeter Avalos * These are from a previous version of the protocol, whose
32841c99275SPeter Avalos * packet format was machine-specific.
32941c99275SPeter Avalos *
33041c99275SPeter Avalos * so perhaps we should just dump the packet, in hex.
33141c99275SPeter Avalos */
332411677aeSAaron LI print_unknown_data(ndo, (const uint8_t *)&rp->rip_cmd, "\n\t", length);
333*ed775ee7SAntonio Huete Jimenez return;
334*ed775ee7SAntonio Huete Jimenez }
335*ed775ee7SAntonio Huete Jimenez
33641c99275SPeter Avalos /* dump version and lets see if we know the commands name*/
337*ed775ee7SAntonio Huete Jimenez cmd = GET_U_1(rp->rip_cmd);
338*ed775ee7SAntonio Huete Jimenez ND_PRINT(", %s, length: %u",
339*ed775ee7SAntonio Huete Jimenez tok2str(rip_cmd_values, "unknown command (%u)", cmd),
340*ed775ee7SAntonio Huete Jimenez length);
34141c99275SPeter Avalos
342411677aeSAaron LI if (ndo->ndo_vflag < 1)
34341c99275SPeter Avalos return;
34441c99275SPeter Avalos
345*ed775ee7SAntonio Huete Jimenez switch (cmd) {
346*ed775ee7SAntonio Huete Jimenez
347411677aeSAaron LI case RIPCMD_REQUEST:
34841c99275SPeter Avalos case RIPCMD_RESPONSE:
349*ed775ee7SAntonio Huete Jimenez switch (vers) {
350*ed775ee7SAntonio Huete Jimenez
351*ed775ee7SAntonio Huete Jimenez case 1:
352*ed775ee7SAntonio Huete Jimenez routecount = length / RIP_ROUTELEN;
353*ed775ee7SAntonio Huete Jimenez ND_PRINT(", routes: %u", routecount);
354*ed775ee7SAntonio Huete Jimenez p = (const u_char *)(rp + 1);
355*ed775ee7SAntonio Huete Jimenez while (len != 0) {
356*ed775ee7SAntonio Huete Jimenez entry_size = rip_entry_print_v1(ndo, p, len);
357*ed775ee7SAntonio Huete Jimenez if (entry_size == 0) {
358*ed775ee7SAntonio Huete Jimenez /* Error */
359*ed775ee7SAntonio Huete Jimenez nd_print_trunc(ndo);
360411677aeSAaron LI break;
361411677aeSAaron LI }
362*ed775ee7SAntonio Huete Jimenez if (len < entry_size) {
363*ed775ee7SAntonio Huete Jimenez ND_PRINT(" [remaining entries length %u < %u]",
364*ed775ee7SAntonio Huete Jimenez len, entry_size);
365*ed775ee7SAntonio Huete Jimenez nd_print_invalid(ndo);
366*ed775ee7SAntonio Huete Jimenez break;
367*ed775ee7SAntonio Huete Jimenez }
368*ed775ee7SAntonio Huete Jimenez p += entry_size;
369*ed775ee7SAntonio Huete Jimenez len -= entry_size;
370*ed775ee7SAntonio Huete Jimenez }
371*ed775ee7SAntonio Huete Jimenez break;
372*ed775ee7SAntonio Huete Jimenez
373*ed775ee7SAntonio Huete Jimenez case 2:
374*ed775ee7SAntonio Huete Jimenez routecount = length / RIP_ROUTELEN;
375*ed775ee7SAntonio Huete Jimenez ND_PRINT(", routes: %u or less", routecount);
376*ed775ee7SAntonio Huete Jimenez p = (const u_char *)(rp + 1);
377*ed775ee7SAntonio Huete Jimenez while (len != 0) {
378*ed775ee7SAntonio Huete Jimenez entry_size = rip_entry_print_v2(ndo, p, len);
379*ed775ee7SAntonio Huete Jimenez if (entry_size == 0) {
380*ed775ee7SAntonio Huete Jimenez /* Error */
381*ed775ee7SAntonio Huete Jimenez nd_print_trunc(ndo);
382*ed775ee7SAntonio Huete Jimenez break;
383*ed775ee7SAntonio Huete Jimenez }
384*ed775ee7SAntonio Huete Jimenez if (len < entry_size) {
385*ed775ee7SAntonio Huete Jimenez ND_PRINT(" [remaining entries length %u < %u]",
386*ed775ee7SAntonio Huete Jimenez len, entry_size);
387*ed775ee7SAntonio Huete Jimenez nd_print_invalid(ndo);
388*ed775ee7SAntonio Huete Jimenez break;
389*ed775ee7SAntonio Huete Jimenez }
390*ed775ee7SAntonio Huete Jimenez p += entry_size;
391*ed775ee7SAntonio Huete Jimenez len -= entry_size;
392*ed775ee7SAntonio Huete Jimenez }
393*ed775ee7SAntonio Huete Jimenez break;
394*ed775ee7SAntonio Huete Jimenez
395*ed775ee7SAntonio Huete Jimenez default:
396*ed775ee7SAntonio Huete Jimenez ND_PRINT(", unknown version");
397*ed775ee7SAntonio Huete Jimenez break;
398*ed775ee7SAntonio Huete Jimenez }
39941c99275SPeter Avalos break;
40041c99275SPeter Avalos
40141c99275SPeter Avalos case RIPCMD_TRACEOFF:
40241c99275SPeter Avalos case RIPCMD_POLL:
40341c99275SPeter Avalos case RIPCMD_POLLENTRY:
40441c99275SPeter Avalos break;
40541c99275SPeter Avalos
40641c99275SPeter Avalos case RIPCMD_TRACEON:
40741c99275SPeter Avalos /* fall through */
40841c99275SPeter Avalos default:
409411677aeSAaron LI if (ndo->ndo_vflag <= 1) {
410411677aeSAaron LI if (!print_unknown_data(ndo, (const uint8_t *)rp, "\n\t", length))
41141c99275SPeter Avalos return;
41241c99275SPeter Avalos }
41341c99275SPeter Avalos break;
41441c99275SPeter Avalos }
41541c99275SPeter Avalos /* do we want to see an additionally hexdump ? */
416411677aeSAaron LI if (ndo->ndo_vflag> 1) {
417411677aeSAaron LI if (!print_unknown_data(ndo, (const uint8_t *)rp, "\n\t", length))
41841c99275SPeter Avalos return;
41941c99275SPeter Avalos }
420*ed775ee7SAntonio Huete Jimenez trunc:
421*ed775ee7SAntonio Huete Jimenez return;
42241c99275SPeter Avalos }
423