xref: /netbsd-src/external/bsd/tcpdump/dist/print-ip-demux.c (revision c41df9f6167ea7cd2f761f0a97783c8267cb8847)
1*d881c474Schristos /*
2*d881c474Schristos  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
3*d881c474Schristos  *	The Regents of the University of California.  All rights reserved.
4*d881c474Schristos  *
5*d881c474Schristos  * Redistribution and use in source and binary forms, with or without
6*d881c474Schristos  * modification, are permitted provided that: (1) source code distributions
7*d881c474Schristos  * retain the above copyright notice and this paragraph in its entirety, (2)
8*d881c474Schristos  * distributions including binary code include the above copyright notice and
9*d881c474Schristos  * this paragraph in its entirety in the documentation or other materials
10*d881c474Schristos  * provided with the distribution, and (3) all advertising materials mentioning
11*d881c474Schristos  * features or use of this software display the following acknowledgement:
12*d881c474Schristos  * ``This product includes software developed by the University of California,
13*d881c474Schristos  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14*d881c474Schristos  * the University nor the names of its contributors may be used to endorse
15*d881c474Schristos  * or promote products derived from this software without specific prior
16*d881c474Schristos  * written permission.
17*d881c474Schristos  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18*d881c474Schristos  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19*d881c474Schristos  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20*d881c474Schristos  */
21*d881c474Schristos 
22*d881c474Schristos /* \summary: IPv4/IPv6 payload printer */
23*d881c474Schristos 
24*d881c474Schristos #include <config.h>
25*d881c474Schristos 
26*d881c474Schristos #include "netdissect-stdinc.h"
27*d881c474Schristos 
28*d881c474Schristos #include "netdissect.h"
29*d881c474Schristos #include "addrtoname.h"
30*d881c474Schristos #include "extract.h"
31*d881c474Schristos 
32*d881c474Schristos #include "ip.h"
33*d881c474Schristos #include "ipproto.h"
34*d881c474Schristos 
35*d881c474Schristos void
36*d881c474Schristos ip_demux_print(netdissect_options *ndo,
37*d881c474Schristos 	       const u_char *bp,
38*d881c474Schristos 	       u_int length, u_int ver, int fragmented, u_int ttl_hl,
39*d881c474Schristos 	       uint8_t nh, const u_char *iph)
40*d881c474Schristos {
41*d881c474Schristos 	int advance;
42*d881c474Schristos 	const char *p_name;
43*d881c474Schristos 
44*d881c474Schristos 	advance = 0;
45*d881c474Schristos 
46*d881c474Schristos again:
47*d881c474Schristos 	switch (nh) {
48*d881c474Schristos 
49*d881c474Schristos 	case IPPROTO_AH:
50*d881c474Schristos 		if (!ND_TTEST_1(bp)) {
51*d881c474Schristos 			ndo->ndo_protocol = "ah";
52*d881c474Schristos 			nd_print_trunc(ndo);
53*d881c474Schristos 			break;
54*d881c474Schristos 		}
55*d881c474Schristos 		nh = GET_U_1(bp);
56*d881c474Schristos 		advance = ah_print(ndo, bp);
57*d881c474Schristos 		if (advance <= 0)
58*d881c474Schristos 			break;
59*d881c474Schristos 		bp += advance;
60*d881c474Schristos 		length -= advance;
61*d881c474Schristos 		goto again;
62*d881c474Schristos 
63*d881c474Schristos 	case IPPROTO_ESP:
64*d881c474Schristos 	{
65*d881c474Schristos 		esp_print(ndo, bp, length, iph, ver, fragmented, ttl_hl);
66*d881c474Schristos 		/*
67*d881c474Schristos 		 * Either this has decrypted the payload and
68*d881c474Schristos 		 * printed it, in which case there's nothing more
69*d881c474Schristos 		 * to do, or it hasn't, in which case there's
70*d881c474Schristos 		 * nothing more to do.
71*d881c474Schristos 		 */
72*d881c474Schristos 		break;
73*d881c474Schristos 	}
74*d881c474Schristos 
75*d881c474Schristos 	case IPPROTO_IPCOMP:
76*d881c474Schristos 	{
77*d881c474Schristos 		ipcomp_print(ndo, bp);
78*d881c474Schristos 		/*
79*d881c474Schristos 		 * Either this has decompressed the payload and
80*d881c474Schristos 		 * printed it, in which case there's nothing more
81*d881c474Schristos 		 * to do, or it hasn't, in which case there's
82*d881c474Schristos 		 * nothing more to do.
83*d881c474Schristos 		 */
84*d881c474Schristos 		break;
85*d881c474Schristos 	}
86*d881c474Schristos 
87*d881c474Schristos 	case IPPROTO_SCTP:
88*d881c474Schristos 		sctp_print(ndo, bp, iph, length);
89*d881c474Schristos 		break;
90*d881c474Schristos 
91*d881c474Schristos 	case IPPROTO_DCCP:
92*d881c474Schristos 		dccp_print(ndo, bp, iph, length);
93*d881c474Schristos 		break;
94*d881c474Schristos 
95*d881c474Schristos 	case IPPROTO_TCP:
96*d881c474Schristos 		tcp_print(ndo, bp, length, iph, fragmented);
97*d881c474Schristos 		break;
98*d881c474Schristos 
99*d881c474Schristos 	case IPPROTO_UDP:
100*d881c474Schristos 		udp_print(ndo, bp, length, iph, fragmented, ttl_hl);
101*d881c474Schristos 		break;
102*d881c474Schristos 
103*d881c474Schristos 	case IPPROTO_ICMP:
104*d881c474Schristos 		if (ver == 4)
105*d881c474Schristos 			icmp_print(ndo, bp, length, iph, fragmented);
106*d881c474Schristos 		else {
107*d881c474Schristos 			ND_PRINT("[%s requires IPv4]",
108*d881c474Schristos 				 tok2str(ipproto_values,"unknown",nh));
109*d881c474Schristos 			nd_print_invalid(ndo);
110*d881c474Schristos 		}
111*d881c474Schristos 		break;
112*d881c474Schristos 
113*d881c474Schristos 	case IPPROTO_ICMPV6:
114*d881c474Schristos 		if (ver == 6)
115*d881c474Schristos 			icmp6_print(ndo, bp, length, iph, fragmented);
116*d881c474Schristos 		else {
117*d881c474Schristos 			ND_PRINT("[%s requires IPv6]",
118*d881c474Schristos 				 tok2str(ipproto_values,"unknown",nh));
119*d881c474Schristos 			nd_print_invalid(ndo);
120*d881c474Schristos 		}
121*d881c474Schristos 		break;
122*d881c474Schristos 
123*d881c474Schristos 	case IPPROTO_PIGP:
124*d881c474Schristos 		/*
125*d881c474Schristos 		 * XXX - the current IANA protocol number assignments
126*d881c474Schristos 		 * page lists 9 as "any private interior gateway
127*d881c474Schristos 		 * (used by Cisco for their IGRP)" and 88 as
128*d881c474Schristos 		 * "EIGRP" from Cisco.
129*d881c474Schristos 		 *
130*d881c474Schristos 		 * Recent BSD <netinet/in.h> headers define
131*d881c474Schristos 		 * IP_PROTO_PIGP as 9 and IP_PROTO_IGRP as 88.
132*d881c474Schristos 		 * We define IP_PROTO_PIGP as 9 and
133*d881c474Schristos 		 * IP_PROTO_EIGRP as 88; those names better
134*d881c474Schristos 		 * match was the current protocol number
135*d881c474Schristos 		 * assignments say.
136*d881c474Schristos 		 */
137*d881c474Schristos 		igrp_print(ndo, bp, length);
138*d881c474Schristos 		break;
139*d881c474Schristos 
140*d881c474Schristos 	case IPPROTO_EIGRP:
141*d881c474Schristos 		eigrp_print(ndo, bp, length);
142*d881c474Schristos 		break;
143*d881c474Schristos 
144*d881c474Schristos 	case IPPROTO_ND:
145*d881c474Schristos 		ND_PRINT(" nd %u", length);
146*d881c474Schristos 		break;
147*d881c474Schristos 
148*d881c474Schristos 	case IPPROTO_EGP:
149*d881c474Schristos 		egp_print(ndo, bp, length);
150*d881c474Schristos 		break;
151*d881c474Schristos 
152*d881c474Schristos 	case IPPROTO_OSPF:
153*d881c474Schristos 		if (ver == 6)
154*d881c474Schristos 			ospf6_print(ndo, bp, length);
155*d881c474Schristos 		else
156*d881c474Schristos 			ospf_print(ndo, bp, length, iph);
157*d881c474Schristos 		break;
158*d881c474Schristos 
159*d881c474Schristos 	case IPPROTO_IGMP:
160*d881c474Schristos 		if (ver == 4)
161*d881c474Schristos 			igmp_print(ndo, bp, length);
162*d881c474Schristos 		else {
163*d881c474Schristos 			ND_PRINT("[%s requires IPv4]",
164*d881c474Schristos 				 tok2str(ipproto_values,"unknown",nh));
165*d881c474Schristos 			nd_print_invalid(ndo);
166*d881c474Schristos 		}
167*d881c474Schristos 		break;
168*d881c474Schristos 
169*d881c474Schristos 	case IPPROTO_IPV4:
170*d881c474Schristos 		/* ipv4-in-ip encapsulation */
171*d881c474Schristos 		ip_print(ndo, bp, length);
172*d881c474Schristos 		break;
173*d881c474Schristos 
174*d881c474Schristos 	case IPPROTO_IPV6:
175*d881c474Schristos 		/* ip6-in-ip encapsulation */
176*d881c474Schristos 		ip6_print(ndo, bp, length);
177*d881c474Schristos 		break;
178*d881c474Schristos 
179*d881c474Schristos 	case IPPROTO_RSVP:
180*d881c474Schristos 		rsvp_print(ndo, bp, length);
181*d881c474Schristos 		break;
182*d881c474Schristos 
183*d881c474Schristos 	case IPPROTO_GRE:
184*d881c474Schristos 		gre_print(ndo, bp, length);
185*d881c474Schristos 		break;
186*d881c474Schristos 
187*d881c474Schristos 	case IPPROTO_MOBILE:
188*d881c474Schristos 		mobile_print(ndo, bp, length);
189*d881c474Schristos 		break;
190*d881c474Schristos 
191*d881c474Schristos 	case IPPROTO_PIM:
192*d881c474Schristos 		pim_print(ndo, bp, length, iph);
193*d881c474Schristos 		break;
194*d881c474Schristos 
195*d881c474Schristos 	case IPPROTO_VRRP:
196*d881c474Schristos 		if (ndo->ndo_packettype == PT_CARP) {
197*d881c474Schristos 			carp_print(ndo, bp, length, ttl_hl);
198*d881c474Schristos 		} else {
199*d881c474Schristos 			vrrp_print(ndo, bp, length, iph, ttl_hl, ver);
200*d881c474Schristos 		}
201*d881c474Schristos 		break;
202*d881c474Schristos 
203*d881c474Schristos 	case IPPROTO_PGM:
204*d881c474Schristos 		pgm_print(ndo, bp, length, iph);
205*d881c474Schristos 		break;
206*d881c474Schristos 
207*d881c474Schristos 	case IPPROTO_ETHERNET:
208*d881c474Schristos 		if (ver == 6)
209*d881c474Schristos 			ether_print(ndo, bp, length, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL);
210*d881c474Schristos 		else {
211*d881c474Schristos 			ND_PRINT("[%s requires IPv6]",
212*d881c474Schristos 				 tok2str(ipproto_values,"unknown",nh));
213*d881c474Schristos 			nd_print_invalid(ndo);
214*d881c474Schristos 		}
215*d881c474Schristos 		break;
216*d881c474Schristos 
217*d881c474Schristos 	case IPPROTO_NONE:
218*d881c474Schristos 		ND_PRINT("no next header");
219*d881c474Schristos 		break;
220*d881c474Schristos 
221*d881c474Schristos 	default:
222*d881c474Schristos 		if (ndo->ndo_nflag==0 && (p_name = netdb_protoname(nh)) != NULL)
223*d881c474Schristos 			ND_PRINT(" %s", p_name);
224*d881c474Schristos 		else
225*d881c474Schristos 			ND_PRINT(" ip-proto-%u", nh);
226*d881c474Schristos 		ND_PRINT(" %u", length);
227*d881c474Schristos 		break;
228*d881c474Schristos 	}
229*d881c474Schristos }
230