diff options
Diffstat (limited to 'contrib/tcpdump/print-null.c')
-rw-r--r-- | contrib/tcpdump/print-null.c | 124 |
1 files changed, 45 insertions, 79 deletions
diff --git a/contrib/tcpdump/print-null.c b/contrib/tcpdump/print-null.c index c346931..f8aa37b 100644 --- a/contrib/tcpdump/print-null.c +++ b/contrib/tcpdump/print-null.c @@ -17,18 +17,24 @@ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $FreeBSD$ */ #ifndef lint -static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-null.c,v 1.49.2.2 2003/11/16 08:51:36 guy Exp $ (LBL)"; +static const char rcsid[] = + "@(#) $Header: /tcpdump/master/tcpdump/print-null.c,v 1.41.4.1 2002/06/01 23:51:15 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include <tcpdump-stdinc.h> +#include <sys/param.h> +#include <sys/time.h> +#include <sys/socket.h> + +#include <netinet/in.h> #include <pcap.h> #include <stdio.h> @@ -42,6 +48,10 @@ static const char rcsid[] _U_ = #include "ip6.h" #endif +#ifndef AF_NS +#define AF_NS 6 /* XEROX NS protocols */ +#endif + /* * The DLT_NULL packet header is 4 bytes long. It contains a host-byte-order * 32-bit integer that specifies the family, e.g. AF_INET. @@ -54,22 +64,6 @@ static const char rcsid[] _U_ = */ #define NULL_HDRLEN 4 -/* - * BSD AF_ values. - * - * Unfortunately, the BSDs don't all use the same value for AF_INET6, - * so, because we want to be able to read captures from all of the BSDs, - * we check for all of them. - */ -#define BSD_AF_INET 2 -#define BSD_AF_NS 6 /* XEROX NS protocols */ -#define BSD_AF_ISO 7 -#define BSD_AF_APPLETALK 16 -#define BSD_AF_IPX 23 -#define BSD_AF_INET6_BSD 24 /* OpenBSD (and probably NetBSD), BSD/OS */ -#define BSD_AF_INET6_FREEBSD 28 -#define BSD_AF_INET6_DARWIN 30 - static void null_print(u_int family, u_int length) { @@ -78,34 +72,20 @@ null_print(u_int family, u_int length) else { switch (family) { - case BSD_AF_INET: + case AF_INET: printf("ip "); break; #ifdef INET6 - case BSD_AF_INET6_BSD: - case BSD_AF_INET6_FREEBSD: - case BSD_AF_INET6_DARWIN: + case AF_INET6: printf("ip6 "); break; #endif - case BSD_AF_NS: + case AF_NS: printf("ns "); break; - case BSD_AF_ISO: - printf("osi "); - break; - - case BSD_AF_APPLETALK: - printf("atalk "); - break; - - case BSD_AF_IPX: - printf("ipx "); - break; - default: printf("AF %u ", family); break; @@ -122,23 +102,16 @@ null_print(u_int family, u_int length) #define SWAPLONG(y) \ ((((y)&0xff)<<24) | (((y)&0xff00)<<8) | (((y)&0xff0000)>>8) | (((y)>>24)&0xff)) -/* - * This is the top level routine of the printer. 'p' points - * to the ether header of the packet, 'h->ts' is the timestamp, - * 'h->length' is the length of the packet off the wire, and 'h->caplen' - * is the number of bytes actually captured. - */ -u_int -null_if_print(const struct pcap_pkthdr *h, const u_char *p) +void +null_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p) { u_int length = h->len; u_int caplen = h->caplen; + const struct ip *ip; u_int family; - if (caplen < NULL_HDRLEN) { - printf("[|null]"); - return (NULL_HDRLEN); - } + ++infodelay; + ts_print(&h->ts); memcpy((char *)&family, (char *)p, sizeof(family)); @@ -153,47 +126,40 @@ null_if_print(const struct pcap_pkthdr *h, const u_char *p) if ((family & 0xFFFF0000) != 0) family = SWAPLONG(family); + /* + * Some printers want to get back at the link level addresses, + * and/or check that they're not walking off the end of the packet. + * Rather than pass them all the way down, we set these globals. + */ + packetp = p; + snapend = p + caplen; + length -= NULL_HDRLEN; - caplen -= NULL_HDRLEN; - p += NULL_HDRLEN; + + ip = (struct ip *)(p + NULL_HDRLEN); if (eflag) null_print(family, length); - switch (family) { - - case BSD_AF_INET: - ip_print(p, length); + switch (IP_V(ip)) { + case 4: + ip_print((const u_char *)ip, length); break; - #ifdef INET6 - case BSD_AF_INET6_BSD: - case BSD_AF_INET6_FREEBSD: - case BSD_AF_INET6_DARWIN: - ip6_print(p, length); - break; -#endif - - case BSD_AF_ISO: - isoclns_print(p, length, caplen); - break; - - case BSD_AF_APPLETALK: - atalk_print(p, length); + case 6: + ip6_print((const u_char *)ip, length); break; - - case BSD_AF_IPX: - ipx_print(p, length); - break; - +#endif /* INET6 */ default: - /* unknown AF_ value */ - if (!eflag) - null_print(family, length + NULL_HDRLEN); - if (!xflag && !qflag) - default_print(p, caplen); + printf("ip v%d", IP_V(ip)); + break; } - return (NULL_HDRLEN); + if (xflag) + default_print((const u_char *)ip, caplen - NULL_HDRLEN); + putchar('\n'); + --infodelay; + if (infoprint) + info(0); } |