]>
The Tcpdump Group git mirrors - tcpdump/blob - print-gre.c
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms are permitted
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Lawrence Berkeley Laboratory,
11 * Berkeley, CA. The name of the University may not be used to
12 * endorse or promote products derived from this software without
13 * specific prior written permission.
14 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
16 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18 * Initial contribution from John Hawkinson <jhawk@bbnplanet.com>
20 * This module implements support for decoding GRE (Generic Routing
21 * Encapsulation) tunnels; they're documented in RFC1701 and RFC1702.
22 * This code only supports the IP encapsulation thereof.
26 static const char rcsid
[] =
27 "@(#) $Header: /tcpdump/master/tcpdump/print-gre.c,v 1.4 1999-10-07 23:47:11 mcr Exp $";
30 #include <sys/param.h>
33 #include <sys/socket.h>
35 #include <netinet/in.h>
36 #include <netinet/in_systm.h>
37 #include <netinet/ip.h>
42 #include "interface.h"
43 #include "addrtoname.h"
44 #include "extract.h" /* must come after interface.h */
73 #define GRE_CP 0x8000 /* Checksum Present */
74 #define GRE_RP 0x4000 /* Routing Present */
75 #define GRE_KP 0x2000 /* Key Present */
76 #define GRE_SP 0x1000 /* Sequence Present */
79 #define GREPROTO_IP 0x0800
83 * Deencapsulate and print a GRE-tunneled IP datagram
86 gre_print(const u_char
*bp
, u_int length
)
88 const u_char
*cp
= bp
+ 4;
89 const struct gre
*gre
;
92 gre
= (const struct gre
*)bp
;
94 if (length
< GRE_SIZE
) {
97 flags
= EXTRACT_16BITS(&gre
->flags
);
98 proto
= EXTRACT_16BITS(&gre
->proto
);
101 /* Decode the flags */
113 /* Checksum & Offset are present */
114 if ((flags
& GRE_CP
) | (flags
& GRE_RP
))
117 /* We don't support routing fields (variable length) now. Punt. */
129 ip_print(cp
, length
- ((cp
- bp
) / sizeof(u_char
)));
133 printf("gre-proto-0x%04X", proto
);
139 fputs("[|gre]", stdout
);