Annotation of embedaddon/hping2/hping2.h, revision 1.1.1.1

1.1       misho       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.19 2003/08/07 23:55:55 antirez 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>