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