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