/* * $smu-mark$ * $name: sendudp.c$ * $author: Salvatore Sanfilippo $ * $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$ * $license: This software is under GPL version 2 of license$ * $date: Fri Nov 5 11:55:49 MET 1999$ * $rev: 8$ */ /* $Id: send.c,v 1.6 2003/08/01 14:53:08 antirez Exp $ */ #include #include #include #include #include #include #include #include "hping2.h" #include "globals.h" #ifndef INET6_ADDRSTRLEN #define INET6_ADDRSTRLEN sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") #endif static void select_next_random_source(void) { unsigned char ra[4]; ra[0] = hp_rand() & 0xFF; ra[1] = hp_rand() & 0xFF; ra[2] = hp_rand() & 0xFF; ra[3] = hp_rand() & 0xFF; memcpy(&ADDR4(&local).s_addr, ra, 4); if (opt_debug) printf("DEBUG: the source address is %u.%u.%u.%u\n", ra[0], ra[1], ra[2], ra[3]); } static void select_next_random_ipv6_source(void) { unsigned char ra[16]; ra[0] = hp_rand() & 0xFF; ra[1] = hp_rand() & 0xFF; ra[2] = hp_rand() & 0xFF; ra[3] = hp_rand() & 0xFF; ra[4] = hp_rand() & 0xFF; ra[5] = hp_rand() & 0xFF; ra[6] = hp_rand() & 0xFF; ra[7] = hp_rand() & 0xFF; ra[8] = hp_rand() & 0xFF; ra[9] = hp_rand() & 0xFF; ra[10] = hp_rand() & 0xFF; ra[11] = hp_rand() & 0xFF; ra[12] = hp_rand() & 0xFF; ra[13] = hp_rand() & 0xFF; ra[14] = hp_rand() & 0xFF; ra[15] = hp_rand() & 0xFF; memcpy(&ADDR6(&local).s6_addr, ra, 16); } static void select_next_random_ipv6_dest(void) { unsigned char ra[16]; ra[0] = hp_rand() & 0xFF; ra[1] = hp_rand() & 0xFF; ra[2] = hp_rand() & 0xFF; ra[3] = hp_rand() & 0xFF; ra[4] = hp_rand() & 0xFF; ra[5] = hp_rand() & 0xFF; ra[6] = hp_rand() & 0xFF; ra[7] = hp_rand() & 0xFF; ra[8] = hp_rand() & 0xFF; ra[9] = hp_rand() & 0xFF; ra[10] = hp_rand() & 0xFF; ra[11] = hp_rand() & 0xFF; ra[12] = hp_rand() & 0xFF; ra[13] = hp_rand() & 0xFF; ra[14] = hp_rand() & 0xFF; ra[15] = hp_rand() & 0xFF; memcpy(&ADDR6(&remote).s6_addr, ra, 16); } static void select_next_random_ipv6_source_simple(void) { struct in6_addr rand6; rand6 = ipv6_rand("2200::",8); memcpy(&ADDR6(&local).s6_addr, rand6.s6_addr,16); } static void select_next_random_ipv6_dest_simple(void) { struct in6_addr rand6; rand6 = ipv6_rand("2200::",8); memcpy(&ADDR6(&remote).s6_addr, rand6.s6_addr,16); } static void select_next_random_dest(void) { unsigned char ra[4]; char a[4], b[4], c[4], d[4]; if (sscanf(targetname, "%4[^.].%4[^.].%4[^.].%4[^.]", a, b, c, d) != 4) { fprintf(stderr, "wrong --rand-dest target host, correct examples:\n" " x.x.x.x, 192,168.x.x, 128.x.x.255\n" "you typed: %s\n", targetname); exit(1); } a[3] = b[3] = c[3] = d[3] = '\0'; ra[0] = a[0] == 'x' ? (hp_rand() & 0xFF) : strtoul(a, NULL, 0); ra[1] = b[0] == 'x' ? (hp_rand() & 0xFF) : strtoul(b, NULL, 0); ra[2] = c[0] == 'x' ? (hp_rand() & 0xFF) : strtoul(c, NULL, 0); ra[3] = d[0] == 'x' ? (hp_rand() & 0xFF) : strtoul(d, NULL, 0); memcpy(&ADDR4(&remote).s_addr, ra, 4); if (opt_debug) { printf("DEBUG: the dest address is %u.%u.%u.%u\n", ra[0], ra[1], ra[2], ra[3]); } } long long sum_bytes; unsigned int sum_packets; /* The signal handler for SIGALRM will send the packets */ #define TDIFF(a,b) (((a).tv_usec - (b).tv_usec)/1000+((a).tv_sec - (b).tv_sec)*1000) void send_packet (int signal_id) { int errno_save = errno; struct timeval tv1, tv2; int lel = 0; gettimeofday(&tv1, NULL); do{ if (opt_rand_dest){ if(opt_ipv6) { select_next_random_ipv6_dest(); } else { select_next_random_dest(); } } if (opt_rand_source){ if(opt_ipv6) { select_next_random_ipv6_source(); } else { select_next_random_source(); } } if (opt_rawipmode) send_rawip(); else if (opt_icmpmode){if(opt_ipv6)send_icmp6(); else send_icmp();} else if (opt_udpmode) send_udp(); else send_tcp(); sent_pkt++; if((opt_pps || opt_bps) && (sum_packets & 127) == 13) { int el; gettimeofday(&tv2, NULL); el = TDIFF(tv2, tv1); if(opt_bps) { if(sum_bytes * 1000 / opt_bps > el) usleep((sum_bytes * 1000 / opt_bps - el) * 1000); } else if(opt_pps) { if(sum_packets * 1000 / opt_pps > el) usleep((sum_packets * 1000 / opt_pps - el) * 1000); } if(el - lel > 100) { float bps, pps; char *bpsc, *ppsc; gettimeofday(&tv2, NULL); el = TDIFF(tv2, tv1); pps = (float)sum_packets*1000/el; bps = (float)sum_bytes*8000/el; bpsc = ppsc = ""; if(bps > 9999999999.0) { bps /= 1000000000.0; bpsc = "G"; } else if(bps > 9999999) { bps /= 1000000; bpsc = "M"; } else if(bps > 9999) { bps /= 1000; bpsc = "k"; } if(pps > 9999999) { pps /= 1000000; ppsc = "M"; } else if(pps > 9999) { pps /= 1000; ppsc = "k"; } printf("\rt: %.2fs, %.1f %spps, %.1f %sbps ", (float)el/1000.0, pps, ppsc, bps, bpsc); fflush(stdout); lel = el; } } }while(opt_pps || opt_bps); Signal(SIGALRM, send_packet); if (count != -1 && count == sent_pkt) { /* count reached? */ Signal(SIGALRM, print_statistics); alarm(COUNTREACHED_TIMEOUT); } else if (!opt_listenmode) { if (opt_waitinusec == FALSE) alarm(sending_wait); else setitimer(ITIMER_REAL, &usec_delay, NULL); } errno = errno_save; }