/* * Copyright (c) 2000 Paul Herman * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: tcpstat.h,v 1.41 2002/06/01 06:42:08 pherman Exp $ */ #ifndef TCPSTAT_TCPSTAT_H #define TCPSTAT_TCPSTAT_H #ifdef HAVE_CONFIG_H # include "config.h" #else /* Hmmm, try to wing it */ # ifdef __linux__ # define _BSD_SOURCE # endif #endif /* HAVE_CONFIG_H */ #ifdef HAVE_SYS_TYPES_H #include #endif #include /* printf() */ #include /* fork(), execlp() */ #include /* free(), malloc() */ #include /* bzero() */ #include /* sqrt() */ #include /* tolower */ #include /* struct timeval */ #include /* waitpid() */ #ifdef HAVE_SYS_STAT_H # include /* stat() */ #endif #include /* needed by INET stuff (sockaddr) */ #include /* needed by INET stuff (in_addr) */ #include /* needed by INET stuff (n_long) */ #ifdef HAVE_NETINET_IP6_H # ifdef AIX_STRANGENESS # define STEVENS_API /* this gives us BSD style ip6hdr */ # define ip6_hdr ip6hdr # endif # include /* IPv6 structs and constats */ # include /* IPv6 ICMP stuff */ # ifndef INET6 # define INET6 /* Force INET6 code */ # endif # ifdef TRU64_STRANGENESS # ifndef ip6_vfc # define ip6_vfc ip6_vcf /* Is this a Tru64 typo? */ # endif # endif #endif #ifdef HAVE_NET_ETHERNET_H # include /* struct ether_header */ #else # if defined(HAVE_NETINET_IF_ETHER_H) && defined(AIX_STRANGENESS) # include "netinet/if_ether.h" # else # include "ethernet_stub.h" /* Hope this works... */ # endif #endif #ifndef ETHERTYPE_IPX # define ETHERTYPE_IPX 0x8137 /* IPX Protocol */ #endif #ifndef ETHERTYPE_AT # define ETHERTYPE_AT 0x809B /* AppleTalk protocol */ # define ETHERTYPE_AARP 0x80F3 /* AppleTalk ARP */ #endif #ifndef ETHERTYPE_IPV6 # define ETHERTYPE_IPV6 0x86dd /* IPv6 */ #endif #ifndef ETHER_HDR_LEN # define ETHER_HDR_LEN 14 /* Just in case... */ #endif #ifdef HAVE_NET_IF_H # include /* struct ifnet */ #endif #include /* struct arp_hdr */ #include /* struct ip */ #include /* struct tcphdr */ #include /* struct udphdr */ #include /* struct icmp */ #include /* inet_ntoa() */ #include /* getprotobynumber */ #include /* pcap_*() */ #include #ifdef HAVE_STRINGS_H # include /* Solaris bzero/bcopy/etc... */ #endif #ifdef HAVE_NET_PPP_DEFS_H # include #else # define PPP_HDRLEN 4 #endif /* HAVE_NET_PPP_DEFS_H */ #ifdef HAVE_FCNTL_H # include #else # define O_RDONLY 0x0000 /* open for reading only */ #endif /* HAVE_FCNTL_H */ #ifndef HAVE_PERROR #define perror(x) { fprintf(stderr, "Error: %s\n", x); } #endif /* !HAVE_PERROR */ #ifndef HAVE_SNPRINTF # ifdef __GNUC__ # define snprintf(a, b, c...) sprintf(a, ## c) # else # define snprintf(a, b, c, d) sprintf(a, c, d) # endif /* __GNUC__ */ #endif /* !HAVE_SNPRINTF */ #define BUF_SIZ 4096 /* General string buffer size */ #define PAK_SIZ 32768 #define Double double /* FP accuracy */ /* * Magic numbers for various dump files */ #define PCAP_FILE_MAGIC 0xa1b2c3d4 /* first 4 bytes of PCAP file */ #define PCAP_FILE_MAGIC_RH 0xa1b2cd34 /* proprietary RedHat PCAP file */ #define SNOOP_FILE_MAGIC 0x736e6f6f /* "snoo" */ #define SNOOP_FILE_MAGIC_2 0x70000000 /* "p\0\0\0 */ /* Orthogonal Link types in struct packet_data */ #define LINK_NONE 0x0001 #define LINK_ETHERNET 0x0002 #define LINK_PPP 0x0004 #define GENERIC_LINK_IP 0x0100 #define GENERIC_LINK_IP6 0x0200 #define GENERIC_LINK_OTHER 0xff00 /* supported LINK_NONE types */ #define LINK_NONE_IP 0x0100 #define LINK_NONE_IP6 0x0200 #define LINK_NONE_OTHER 0xff00 /* supported LINK_ETHERNET types */ #define LINK_ETHERNET_IP 0x0100 /* Plain old IP */ #define LINK_ETHERNET_IP6 0x0200 /* New IPv6 */ #define LINK_ETHERNET_ARP 0x0300 /* (A)ddress (R)esolution (P)rotocol */ #define LINK_ETHERNET_REVARP 0x0400 /* Reverse ARP */ #define LINK_ETHERNET_IPX 0x0500 /* IPX */ #define LINK_ETHERNET_AT 0x0600 /* Appletalk */ #define LINK_ETHERNET_AARP 0x0700 /* Appletalk ARP */ #define LINK_ETHERNET_OTHER 0xff00 /* supported LINK_PPP types */ #define LINK_PPP_IP 0x0100 #define LINK_PPP_IP6 0x0200 #define LINK_PPP_IPCP 0x0300 #define LINK_PPP_IPCP6 0x0400 #define LINK_PPP_CCP 0x0500 #define LINK_PPP_LCP 0x0600 #define LINK_PPP_PAP 0x0700 #define LINK_PPP_CHAP 0x0800 #define LINK_PPP_OTHER 0xff00 /* in get_dump_data, flags on how to operate */ #define GET_TCPD_COUNT_LINKSIZE 0x01 #define GET_TCPD_DO_LIVE 0x02 #define GET_TCPD_DO_LIVE_PROMISC 0x04 typedef struct ip_packet { struct ip hdr; union { struct tcphdr tcphdr; struct udphdr udphdr; struct icmp icmp; } body; } ip_packet; #ifdef INET6 typedef struct ip6_packet { struct ip6_hdr hdr; union { struct tcphdr tcphdr; struct udphdr udphdr; struct icmp6_hdr icmp6hdr; } body; } ip6_packet; #endif typedef struct packet_data { struct timeval timestamp; u_int packet_len; u_int buffer_len; u_int link_type; struct ether_header ether; union { struct arphdr arp; struct ip_packet ip; #ifdef INET6 struct ip6_packet ip6; #endif u_char raw[PAK_SIZ]; } data; } packet_data; /************** Prototypes **************/ /* process.c protos */ int get_dump_data(char *fname, char *filter, int flags, Double capture_seconds, void (*hook)(packet_data *, void **), void **args); /* print_packet.c protos */ void print_packet(packet_data *p, int what_to_print); /* utils.c protos */ int is_ethernetarp_packet(packet_data *p); int is_ip_packet(packet_data *p); unsigned char get_ip_proto(packet_data *p); int is_ip_tcp_packet(packet_data *p); int is_ip_udp_packet(packet_data *p); int is_ip_icmp_packet(packet_data *p); #ifdef INET6 int is_ip6_packet(packet_data *p); #endif char *my_basename(char *p); char *my_get_port(u_short port, int n_only); char *my_get_proto(u_short proto, int n_only); char *my_safe_strcpy(char **dst, const char *src); void my_alarm(Double seconds); u_char count_1bits(u_int x); #ifndef HAVE_INET_NTOP char *inet_ntop(int af, void *src, char *dst, int n); #endif /* HAVE_INET_NTOP */ #endif /* TCPSTAT_TCPSTAT_H */ /**************** END *****************/