xref: /openbsd-src/usr.sbin/tcpdump/print-ripng.c (revision e654d8cdd26d89ab3ef1c8068214ba920c998264)
1*e654d8cdSkn /*	$OpenBSD: print-ripng.c,v 1.7 2018/10/22 16:12:45 kn Exp $	*/
2edd7aa8fSjakob 
3edd7aa8fSjakob /*
4edd7aa8fSjakob  * Copyright (c) 1989, 1990, 1991, 1993, 1994
5edd7aa8fSjakob  *	The Regents of the University of California.  All rights reserved.
6edd7aa8fSjakob  *
7edd7aa8fSjakob  * Redistribution and use in source and binary forms, with or without
8edd7aa8fSjakob  * modification, are permitted provided that: (1) source code distributions
9edd7aa8fSjakob  * retain the above copyright notice and this paragraph in its entirety, (2)
10edd7aa8fSjakob  * distributions including binary code include the above copyright notice and
11edd7aa8fSjakob  * this paragraph in its entirety in the documentation or other materials
12edd7aa8fSjakob  * provided with the distribution, and (3) all advertising materials mentioning
13edd7aa8fSjakob  * features or use of this software display the following acknowledgement:
14edd7aa8fSjakob  * ``This product includes software developed by the University of California,
15edd7aa8fSjakob  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
16edd7aa8fSjakob  * the University nor the names of its contributors may be used to endorse
17edd7aa8fSjakob  * or promote products derived from this software without specific prior
18edd7aa8fSjakob  * written permission.
19edd7aa8fSjakob  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
20edd7aa8fSjakob  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
21edd7aa8fSjakob  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22edd7aa8fSjakob  */
23edd7aa8fSjakob 
24edd7aa8fSjakob #include <sys/time.h>
25edd7aa8fSjakob #include <sys/types.h>
26edd7aa8fSjakob #include <sys/socket.h>
27edd7aa8fSjakob 
28edd7aa8fSjakob #include <netinet/in.h>
29edd7aa8fSjakob #include <netinet/ip.h>
30edd7aa8fSjakob #include <netinet/ip_var.h>
31edd7aa8fSjakob #include <netinet/udp.h>
32edd7aa8fSjakob #include <netinet/udp_var.h>
33edd7aa8fSjakob 
34edd7aa8fSjakob #include <errno.h>
35edd7aa8fSjakob #include <stdio.h>
36edd7aa8fSjakob 
37edd7aa8fSjakob #include <netinet/ip6.h>
38edd7aa8fSjakob 
39edd7aa8fSjakob #include "route6d.h"
40edd7aa8fSjakob #include "interface.h"
41edd7aa8fSjakob #include "addrtoname.h"
42edd7aa8fSjakob 
43edd7aa8fSjakob static int
rip6_entry_print(const struct netinfo6 * ni,int metric)446ad041cbSmmcc rip6_entry_print(const struct netinfo6 *ni, int metric)
45edd7aa8fSjakob {
46edd7aa8fSjakob 	int l;
47edd7aa8fSjakob 	l = printf("%s/%d", ip6addr_string(&ni->rip6_dest), ni->rip6_plen);
48edd7aa8fSjakob 	if (ni->rip6_tag)
49edd7aa8fSjakob 		l += printf(" [%d]", ntohs(ni->rip6_tag));
50edd7aa8fSjakob 	if (metric)
51edd7aa8fSjakob 		l += printf(" (%d)", ni->rip6_metric);
52edd7aa8fSjakob 	return l;
53edd7aa8fSjakob }
54edd7aa8fSjakob 
55edd7aa8fSjakob void
ripng_print(const u_char * dat,int length)56edd7aa8fSjakob ripng_print(const u_char *dat, int length)
57edd7aa8fSjakob {
586ad041cbSmmcc 	const struct rip6 *rp = (struct rip6 *)dat;
596ad041cbSmmcc 	const struct netinfo6 *ni;
606ad041cbSmmcc 	int amt = snapend - dat;
616ad041cbSmmcc 	int i = min(length, amt) -
62edd7aa8fSjakob 			 (sizeof(struct rip6) - sizeof(struct netinfo6));
63edd7aa8fSjakob 	int j;
64edd7aa8fSjakob 	int trunc;
65edd7aa8fSjakob 
66edd7aa8fSjakob 	if (i < 0)
67edd7aa8fSjakob 		return;
68edd7aa8fSjakob 
69edd7aa8fSjakob 	switch (rp->rip6_cmd) {
70edd7aa8fSjakob 
71edd7aa8fSjakob 	case RIP6_REQUEST:
72edd7aa8fSjakob 		j = length / sizeof(*ni);
73edd7aa8fSjakob 		if (j == 1
74edd7aa8fSjakob 		    &&  rp->rip6_nets->rip6_metric == HOPCNT_INFINITY6
75edd7aa8fSjakob 		    &&  IN6_IS_ADDR_UNSPECIFIED(&rp->rip6_nets->rip6_dest)) {
76edd7aa8fSjakob 			printf("ripng-req dump");
77edd7aa8fSjakob 			break;
78edd7aa8fSjakob 		}
79edd7aa8fSjakob 		if (j * sizeof(*ni) != length - 4)
80edd7aa8fSjakob 			printf("ripng-req %d[%d]:", j, length);
81edd7aa8fSjakob 		else
82edd7aa8fSjakob 			printf("ripng-req %d:", j);
83edd7aa8fSjakob 		trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
84edd7aa8fSjakob 		for (ni = rp->rip6_nets; (i -= sizeof(*ni)) >= 0; ++ni) {
85edd7aa8fSjakob 			if (vflag)
86edd7aa8fSjakob 				printf("\n\t");
87edd7aa8fSjakob 			else
88edd7aa8fSjakob 				printf(" ");
89edd7aa8fSjakob 			rip6_entry_print(ni, 0);
90edd7aa8fSjakob 		}
91edd7aa8fSjakob 		break;
92edd7aa8fSjakob 	case RIP6_RESPONSE:
93edd7aa8fSjakob 		j = length / sizeof(*ni);
94edd7aa8fSjakob 		if (j * sizeof(*ni) != length - 4)
95edd7aa8fSjakob 			printf("ripng-resp %d[%d]:", j, length);
96edd7aa8fSjakob 		else
97edd7aa8fSjakob 			printf("ripng-resp %d:", j);
98edd7aa8fSjakob 		trunc = ((i / sizeof(*ni)) * sizeof(*ni) != i);
99edd7aa8fSjakob 		for (ni = rp->rip6_nets; (i -= sizeof(*ni)) >= 0; ++ni) {
100edd7aa8fSjakob 			if (vflag)
101edd7aa8fSjakob 				printf("\n\t");
102edd7aa8fSjakob 			else
103edd7aa8fSjakob 				printf(" ");
104edd7aa8fSjakob 			rip6_entry_print(ni, ni->rip6_metric);
105edd7aa8fSjakob 		}
106edd7aa8fSjakob 		if (trunc)
107edd7aa8fSjakob 			printf("[|rip]");
108edd7aa8fSjakob 		break;
109edd7aa8fSjakob 	default:
110edd7aa8fSjakob 		printf("ripng-%d ?? %d", rp->rip6_cmd, length);
111edd7aa8fSjakob 		break;
112edd7aa8fSjakob 	}
113edd7aa8fSjakob 	if (rp->rip6_vers != RIP6_VERSION)
114edd7aa8fSjakob 		printf(" [vers %d]", rp->rip6_vers);
115edd7aa8fSjakob }
116