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