File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / hping2 / hping2.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:11:37 2012 UTC (12 years, 4 months ago) by misho
Branches: hping2, MAIN
CVS tags: v2_0_0rc3p5, v2_0_0rc3p4, v2_0_0rc3p0, v2_0_0rc3, HEAD
hping2

    1: /* 
    2:  * $smu-mark$ 
    3:  * $name: hping2.h$ 
    4:  * $author: Salvatore Sanfilippo <antirez@invece.org>$ 
    5:  * $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$ 
    6:  * $license: This software is under GPL version 2 of license$ 
    7:  * $date: Fri Nov  5 11:55:48 MET 1999$ 
    8:  * $rev: 9$ 
    9:  */ 
   10: 
   11: /* $Id: hping2.h,v 1.1.1.1 2012/02/21 22:11:37 misho Exp $ */
   12: 
   13: #ifndef _HPING2_H
   14: #define _HPING2_H
   15: 
   16: #include <sys/types.h>
   17: #include <sys/socket.h>
   18: #include <netinet/in.h>
   19: #include "byteorder.h"
   20: #include "systype.h"
   21: 
   22: #ifdef __sun__
   23: typedef char                   int_8_t;
   24: typedef unsigned char          u_int8_t;
   25: typedef short                  int_16_t;
   26: typedef unsigned short         u_int16_t;
   27: typedef int                    int_32_t;
   28: typedef unsigned int           u_int32_t;
   29: #endif
   30: 
   31: /* types */
   32: #ifndef __u8
   33: #define __u8		u_int8_t
   34: #endif /* __u8 */
   35: #ifndef __u16
   36: #define __u16		u_int16_t
   37: #endif /* __u16 */
   38: #ifndef __u32
   39: #define __u32		u_int32_t
   40: #endif /* __u32 */
   41: 
   42: #ifndef __uint8_t
   43: #define __uint8_t	u_int8_t
   44: #endif /* __uint8_t */
   45: #ifndef __uint16_t
   46: #define __uint16_t	u_int16_t
   47: #endif /* __uint16_t */
   48: #ifndef __uint32_t
   49: #define __uint32_t	u_int32_t
   50: #endif /* __uint32_t */
   51: 
   52: #include "hcmp.h" /* Hping Control Message Protocol */
   53: 
   54: /* protocols header size */
   55: #ifndef ICMPHDR_SIZE
   56: #define ICMPHDR_SIZE	sizeof(struct myicmphdr)
   57: #endif
   58: #ifndef UDPHDR_SIZE
   59: #define UDPHDR_SIZE	sizeof(struct myudphdr)
   60: #endif
   61: #ifndef TCPHDR_SIZE
   62: #define TCPHDR_SIZE	sizeof(struct mytcphdr)
   63: #endif
   64: #ifndef IPHDR_SIZE
   65: #define IPHDR_SIZE	sizeof(struct myiphdr)
   66: #endif
   67: 
   68: /* wait X seconds after reached to sent packets in oreder to display replies */
   69: #define COUNTREACHED_TIMEOUT 1
   70: 
   71: /* requests status table stuffs */
   72: /* Warning, TABLESIZE 0 == floating point exception */
   73: #define TABLESIZE	400
   74: #define S_SENT		0
   75: #define S_RECV		1
   76: 
   77: /* usefull defines */
   78: #ifndef TRUE
   79: #define TRUE	1
   80: #define FALSE	0
   81: #endif
   82: #ifndef IFNAMSIZ
   83: #define IFNAMSIZ 16
   84: #endif
   85: #ifndef PF_PACKET
   86: #define PF_PACKET 17		/* kernel 2.[12].* with 2.0.* kernel headers? */
   87: #endif
   88: #ifndef ETH_P_IP
   89: #define ETH_P_IP  0x0800	/* Internet Protocol packet     */
   90: #endif
   91: #ifndef ABS
   92: #define ABS(x) (((x)>0) ? (x) : -(x))
   93: #endif
   94: 
   95: /* header size of some physical layer type */
   96: #define PPPHDR_SIZE_LINUX	0
   97: #define PPPHDR_SIZE_FREEBSD	4
   98: #define PPPHDR_SIZE_OPENBSD	4
   99: #define PPPHDR_SIZE_NETBSD	4
  100: #define PPPHDR_SIZE_BSDI	4
  101: #define ETHHDR_SIZE		14
  102: #define LOHDR_SIZE		14
  103: #define WLANHDR_SIZE		14
  104: #define TRHDR_SIZE		20
  105: 
  106: /* packet size (physical header size + ip header + tcp header + 0 data bytes) */
  107: #ifndef IP_MAX_SIZE
  108: #define IP_MAX_SIZE	65535
  109: #endif 
  110: 
  111: /* absolute offsets */
  112: #define ABS_OFFSETIP	linkhdr_size
  113: #define ABS_OFFSETTCP	( linkhdr_size + IPHDR_SIZE )
  114: #define ABS_OFFSETICMP	( linkhdr_size + IPHDR_SIZE )
  115: #define ABS_OFFSETUDP	( linkhdr_size + IPHDR_SIZE )
  116: 
  117: /* defaults and misc */
  118: #define DEFAULT_SENDINGWAIT 1	/* wait 1 sec. between sending each packets */
  119: #define DEFAULT_DPORT	    0	/* default dest. port */
  120: #define DEFAULT_INITSPORT  -1	/* default initial source port: -1 means random */
  121: #define DEFAULT_COUNT      -1	/* default packets count: -1 means forever */
  122: #define DEFAULT_TTL	   64	/* default ip->ttl value */
  123: #define DEFAULT_SRCWINSIZE 512	/* default tcp windows size */
  124: #define DEFAULT_VIRTUAL_MTU 16  /* tiny fragments */
  125: #define DEFAULT_ICMP_TYPE   8	/* echo request */
  126: #define DEFAULT_ICMP_CODE   0	/* icmp-type relative */
  127: #define DEFAULT_ICMP_IP_VERSION		4
  128: #define DEFAULT_ICMP_IP_IHL		(IPHDR_SIZE >> 2)
  129: #define	DEFAULT_ICMP_IP_TOS		0
  130: #define DEFAULT_ICMP_IP_TOT_LEN		0 /* computed by send_icmp_*() */
  131: #define DEFAULT_ICMP_IP_ID		0 /* rand */
  132: #define DEFAULT_ICMP_CKSUM		-1 /* -1 means compute the cksum */
  133: #define DEFAULT_ICMP_IP_PROTOCOL	6 /* TCP */
  134: #define DEFAULT_RAW_IP_PROTOCOL		6 /* TCP */
  135: #define DEFAULT_TRACEROUTE_TTL		1
  136: 
  137: #define BIND_NONE	0		/* no bind */
  138: #define BIND_DPORT	1		/* bind destination port */
  139: #define BIND_TTL	2		/* bind ip->ttl */
  140: #define DEFAULT_BIND	BIND_DPORT
  141: 	
  142: /* fragmentation defines */
  143: #define MF ((unsigned short)0x2000)	/* more fragments */
  144: #define DF ((unsigned short)0x4000)	/* dont fragment */
  145: #define NF ((unsigned short)0x0000)	/* no more fragments */
  146: 
  147: /* ip options defines */
  148: #define IPOPT_COPY		0x80
  149: #define IPOPT_CLASS_MASK	0x60
  150: #define IPOPT_NUMBER_MASK	0x1f
  151: 
  152: #define	IPOPT_COPIED(o)		((o)&IPOPT_COPY)
  153: #define	IPOPT_CLASS(o)		((o)&IPOPT_CLASS_MASK)
  154: #define	IPOPT_NUMBER(o)		((o)&IPOPT_NUMBER_MASK)
  155: 
  156: #define	IPOPT_CONTROL		0x00
  157: #define	IPOPT_RESERVED1		0x20
  158: #define	IPOPT_MEASUREMENT	0x40
  159: #define	IPOPT_RESERVED2		0x60
  160: 
  161: #define IPOPT_END	(0 |IPOPT_CONTROL)
  162: #define IPOPT_NOOP	(1 |IPOPT_CONTROL)
  163: #define IPOPT_SEC	(2 |IPOPT_CONTROL|IPOPT_COPY)
  164: #define IPOPT_LSRR	(3 |IPOPT_CONTROL|IPOPT_COPY)
  165: #define IPOPT_TIMESTAMP	(4 |IPOPT_MEASUREMENT)
  166: #define IPOPT_RR	(7 |IPOPT_CONTROL)
  167: #define IPOPT_SID	(8 |IPOPT_CONTROL|IPOPT_COPY)
  168: #define IPOPT_SSRR	(9 |IPOPT_CONTROL|IPOPT_COPY)
  169: #define IPOPT_RA	(20|IPOPT_CONTROL|IPOPT_COPY)
  170: 
  171: #define IPOPT_OPTVAL 0
  172: #define IPOPT_OLEN   1
  173: #define IPOPT_OFFSET 2
  174: #define IPOPT_MINOFF 4
  175: #define MAX_IPOPTLEN 40
  176: #define IPOPT_NOP IPOPT_NOOP
  177: #define IPOPT_EOL IPOPT_END
  178: #define IPOPT_TS  IPOPT_TIMESTAMP
  179: 
  180: #define	IPOPT_TS_TSONLY		0		/* timestamps only */
  181: #define	IPOPT_TS_TSANDADDR	1		/* timestamps and addresses */
  182: #define	IPOPT_TS_PRESPEC	3		/* specified modules only */
  183: 
  184: /* tcp flags */
  185: #ifndef	TH_FIN
  186: #define TH_FIN  0x01
  187: #endif
  188: #ifndef TH_SYN
  189: #define TH_SYN  0x02
  190: #endif
  191: #ifndef TH_RST
  192: #define TH_RST  0x04
  193: #endif
  194: #ifndef TH_PUSH
  195: #define TH_PUSH 0x08
  196: #endif
  197: #ifndef TH_ACK
  198: #define TH_ACK  0x10
  199: #endif
  200: #ifndef TH_URG
  201: #define TH_URG  0x20
  202: #endif
  203: #ifndef TH_X
  204: #define	TH_X 0x40	/* X tcp flag */
  205: #endif
  206: #ifndef TH_Y
  207: #define TH_Y 0x80	/* Y tcp flag */
  208: #endif
  209: 
  210: /* ICMP TYPE */
  211: #define ICMP_ECHOREPLY          0       /* Echo Reply                   */
  212: #define ICMP_DEST_UNREACH       3       /* Destination Unreachable      */
  213: #define ICMP_SOURCE_QUENCH      4       /* Source Quench                */
  214: #define ICMP_REDIRECT           5       /* Redirect (change route)      */
  215: #define ICMP_ECHO               8       /* Echo Request                 */
  216: #define ICMP_TIME_EXCEEDED      11      /* Time Exceeded                */
  217: #define ICMP_PARAMETERPROB      12      /* Parameter Problem            */
  218: #define ICMP_TIMESTAMP          13      /* Timestamp Request            */
  219: #define ICMP_TIMESTAMPREPLY     14      /* Timestamp Reply              */
  220: #define ICMP_INFO_REQUEST       15      /* Information Request          */
  221: #define ICMP_INFO_REPLY         16      /* Information Reply            */
  222: #define ICMP_ADDRESS            17      /* Address Mask Request         */
  223: #define ICMP_ADDRESSREPLY       18      /* Address Mask Reply           */
  224: 
  225: /* Codes for UNREACHABLE */
  226: #define ICMP_NET_UNREACH        0       /* Network Unreachable          */
  227: #define ICMP_HOST_UNREACH       1       /* Host Unreachable             */
  228: #define ICMP_PROT_UNREACH       2       /* Protocol Unreachable         */
  229: #define ICMP_PORT_UNREACH       3       /* Port Unreachable             */
  230: #define ICMP_FRAG_NEEDED        4       /* Fragmentation Needed/DF set  */
  231: #define ICMP_SR_FAILED          5       /* Source Route failed          */
  232: #define ICMP_NET_UNKNOWN        6
  233: #define ICMP_HOST_UNKNOWN       7
  234: #define ICMP_HOST_ISOLATED      8
  235: #define ICMP_NET_ANO            9
  236: #define ICMP_HOST_ANO           10
  237: #define ICMP_NET_UNR_TOS        11
  238: #define ICMP_HOST_UNR_TOS       12
  239: #define ICMP_PKT_FILTERED       13      /* Packet filtered */
  240: #define ICMP_PREC_VIOLATION     14      /* Precedence violation */
  241: #define ICMP_PREC_CUTOFF        15      /* Precedence cut off */
  242: #define NR_ICMP_UNREACH 15        /* instead of hardcoding immediate value */
  243: 
  244: /* Codes for REDIRECT */
  245: #define ICMP_REDIR_NET          0       /* Redirect Net                 */
  246: #define ICMP_REDIR_HOST         1       /* Redirect Host                */
  247: #define ICMP_REDIR_NETTOS       2       /* Redirect Net for TOS         */
  248: #define ICMP_REDIR_HOSTTOS      3       /* Redirect Host for TOS        */
  249: 
  250: /* Codes for TIME_EXCEEDED */
  251: #define ICMP_EXC_TTL            0       /* TTL count exceeded           */
  252: #define ICMP_EXC_FRAGTIME       1       /* Fragment Reass time exceeded */
  253: 
  254: /*
  255:  * IP header
  256:  */
  257: struct myiphdr {
  258: #if defined(__LITTLE_ENDIAN_BITFIELD)
  259:         __u8    ihl:4,
  260:                 version:4;
  261: #elif defined (__BIG_ENDIAN_BITFIELD)
  262:         __u8    version:4,
  263:                 ihl:4;
  264: #else
  265: #error  "Please, edit Makefile and add -D__(LITTLE|BIG)_ENDIAN_BITFIEND"
  266: #endif
  267:         __u8    tos;
  268:         __u16   tot_len;
  269:         __u16   id;
  270:         __u16   frag_off;
  271:         __u8    ttl;
  272:         __u8    protocol;
  273:         __u16   check;
  274:         __u32   saddr;
  275:         __u32   daddr;
  276: };
  277: 
  278: /*
  279:  * UDP header
  280:  */
  281: struct myudphdr { 
  282: 	__u16 uh_sport;     /* source port */
  283: 	__u16 uh_dport;     /* destination port */
  284: 	__u16 uh_ulen;      /* udp length */
  285: 	__u16 uh_sum;       /* udp checksum */
  286: };
  287: 
  288: /*
  289:  * TCP header.
  290:  * Per RFC 793, September, 1981.
  291:  */
  292: struct mytcphdr {
  293: 	__u16	th_sport;               /* source port */
  294: 	__u16	th_dport;               /* destination port */
  295: 	__u32	th_seq;                 /* sequence number */
  296: 	__u32	th_ack;                 /* acknowledgement number */
  297: #if defined (__LITTLE_ENDIAN_BITFIELD)
  298: 	__u8    th_x2:4,                /* (unused) */
  299: 		th_off:4;               /* data offset */
  300: #elif defined (__BIG_ENDIAN_BITFIELD)
  301: 	__u8    th_off:4,               /* data offset */
  302: 		th_x2:4;                /* (unused) */
  303: #else
  304: #error  "Please, edit Makefile and add -D__(LITTLE|BIG)_ENDIAN_BITFIEND"
  305: #endif
  306: 	__u8    th_flags;
  307: 	__u16   th_win;                 /* window */
  308: 	__u16   th_sum;                 /* checksum */
  309: 	__u16   th_urp;                 /* urgent pointer */
  310: };
  311: 
  312: /*
  313:  * ICMP header
  314:  */
  315: struct myicmphdr
  316: {
  317: 	__u8          type;
  318: 	__u8          code;
  319: 	__u16         checksum;
  320: 	union
  321: 	{
  322: 		struct
  323: 		{
  324: 			__u16   id;
  325: 			__u16   sequence;
  326: 		} echo;
  327: 		__u32   gateway;
  328: 	} un;
  329: };
  330: 
  331: struct icmp_tstamp_data {
  332: 	__u32 orig;
  333: 	__u32 recv;
  334: 	__u32 tran;
  335: };
  336: 
  337: /*
  338:  * UDP/TCP pseudo header
  339:  * for cksum computing
  340:  */
  341: struct pseudohdr
  342: {
  343: 	__u32 saddr;
  344: 	__u32 daddr;
  345: 	__u8  zero;
  346: 	__u8  protocol;
  347: 	__u16 lenght;
  348: };
  349: 
  350: #define PSEUDOHDR_SIZE sizeof(struct pseudohdr)
  351: 
  352: /*
  353:  * hping replies delay table
  354:  */
  355: struct delaytable_element {
  356: 	int seq;
  357: 	int src;
  358: 	time_t sec;
  359: 	time_t usec;
  360: 	int status;
  361: };
  362: 
  363: volatile struct delaytable_element delaytable[TABLESIZE];
  364: 
  365: /* protos */
  366: void	nop(void);				/* nop */
  367: int	parse_options(int, char**);		/* option parser */
  368: int	get_if_name(void);			/* get interface (see source) */
  369: int	get_linkhdr_size(char*);		/* get link layer hdr size */
  370: int	open_sockpacket(void);			/* open SOCK_PACKET socket */
  371: int	close_sockpacket(int);			/* close SOCK_PACKET socket */
  372: int	open_sockraw(void);			/* open raw socket */
  373: void	send_packet (int signal_id);
  374: void	send_rawip (void);
  375: void	send_tcp(void);
  376: void	send_udp(void);
  377: void	send_icmp(void);
  378: void	send_hcmp(__u8 type, __u32 arg);	/* send hcmp packets */
  379: void	send_ip (char*, char*, char*, unsigned int, int, unsigned short,
  380: 		 char*, char);
  381: void	send_ip_handler(char *packet, unsigned int size); /* fragmentation
  382:                                                              handler */
  383: void	wait_packet(void);			/* handle incoming packets */
  384: void	print_statistics(int);
  385: void	show_usage(void);
  386: void	show_version(void);
  387: void	resolve(struct sockaddr*, char*);	/* resolver */
  388: void	log_icmp_unreach(char*, unsigned short);/* ICMP unreachable logger */
  389: void	log_icmp_timeexc(char*, unsigned short);/* ICMP time exceeded logger */
  390: time_t	get_usec(void);				/* return current usec */
  391: time_t	get_midnight_ut_ms(void);		/* ms from UT midnight */
  392: __u16	cksum(__u16 *buf, int nwords);		/* compute 16bit checksum */
  393: void	inc_destparm(int sid);			/* inc dst port or ttl */
  394: char	*get_hostname(char*);			/* get host from addr */
  395: void	datafiller(char *p, int size);		/* fill data from file */
  396: void	data_handler(char *data, int data_size);/* handle data filling */
  397: void	socket_broadcast(int sd);		/* set SO_BROADCAST option */
  398: void	socket_iphdrincl(int sd);		/* set SO_IPHDRINCL option */
  399: void	listenmain(void);			/* main for listen mode */
  400: char	*memstr(char *haystack, char *needle, int size); /* memstr */
  401: void	tos_help(void);				/* show the TOS help */
  402: int	rtt(int *seqp, int recvport, float *ms_delay);	/* compute round trip time */
  403: int	relativize_id(int seqnum, int *ip_id);	/* compute relative id */
  404: int	if_promisc_on(int s);			/* promisc. mode ON */
  405: int	if_promisc_off(int s);			/* promisc. mode OFF */
  406: int	open_pcap(void);			/* open libpcap socket */
  407: int	close_pcap(void);			/* close libpcap socket */
  408: int	pcap_recv(char *, unsigned int);	/* libpcap api wrapper */
  409: int	memlock(char *addr, size_t size);	/* disable paging */
  410: int	memunlock(char *addr, size_t size);	/* enable paging */
  411: int	memlockall(void);			/* disable paging (all pages) */
  412: int	memunlockall(void);			/* enable paging (all pages) */
  413: unsigned char ip_opt_build(char *ip_opt);		/* build ip options */
  414: void	display_ipopt(char* buf);		/* display ip options */
  415: void	icmp_help(void);			/* show the ICMP help */
  416: void	route_help(void);			/* show the route help */
  417: void	(*Signal(int signo, void (*func)(int)))(int);
  418: void	delaytable_add(int seq, int src, time_t sec, time_t usec, int status);
  419: int	read_packet(void *packet, int size);
  420: void	scanmain(void);
  421: u_int32_t hp_rand(void);
  422: #if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && \
  423:     !defined(__bsdi__) && !defined(__APPLE__)
  424: size_t strlcpy(char *dst, const char *src, size_t siz);
  425: #endif
  426: 
  427: /* ARS glue */
  428: void hping_ars_send(char *s);
  429: 
  430: #endif /* _HPING2_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>