| /* An adaptation of Eric Dumazet's udpflood tool. */ |
| |
| #include <stdio.h> |
| #include <stddef.h> |
| #include <malloc.h> |
| #include <string.h> |
| #include <errno.h> |
| #include <unistd.h> |
| |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| #include <netinet/in.h> |
| #include <arpa/inet.h> |
| |
| #define _GNU_SOURCE |
| #include <getopt.h> |
| |
| static int usage(void) |
| { |
| printf("usage: udpflood [ -l count ] [ -m message_size ] [ -c num_ip_addrs ] IP_ADDRESS\n"); |
| return -1; |
| } |
| |
| static int send_packets(in_addr_t start_addr, in_addr_t end_addr, |
| int port, int count, int msg_sz) |
| { |
| char *msg = malloc(msg_sz); |
| struct sockaddr_in saddr; |
| in_addr_t addr; |
| int fd, i, err; |
| |
| if (!msg) |
| return -ENOMEM; |
| |
| memset(msg, 0, msg_sz); |
| |
| addr = start_addr; |
| |
| memset(&saddr, 0, sizeof(saddr)); |
| saddr.sin_family = AF_INET; |
| saddr.sin_port = port; |
| saddr.sin_addr.s_addr = addr; |
| |
| fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); |
| if (fd < 0) { |
| perror("socket"); |
| err = fd; |
| goto out_nofd; |
| } |
| err = connect(fd, (struct sockaddr *) &saddr, sizeof(saddr)); |
| if (err < 0) { |
| perror("connect"); |
| close(fd); |
| goto out; |
| } |
| |
| for (i = 0; i < count; i++) { |
| saddr.sin_addr.s_addr = addr; |
| |
| err = sendto(fd, msg, msg_sz, 0, |
| (struct sockaddr *) &saddr, sizeof(saddr)); |
| if (err < 0) { |
| perror("sendto"); |
| goto out; |
| } |
| |
| if (++addr >= end_addr) |
| addr = start_addr; |
| } |
| |
| err = 0; |
| out: |
| close(fd); |
| out_nofd: |
| free(msg); |
| return err; |
| } |
| |
| int main(int argc, char **argv, char **envp) |
| { |
| int port, msg_sz, count, num_addrs, ret; |
| in_addr_t start_addr, end_addr; |
| |
| port = 6000; |
| msg_sz = 32; |
| count = 10000000; |
| num_addrs = 1; |
| |
| while ((ret = getopt(argc, argv, "l:s:p:c:")) >= 0) { |
| switch (ret) { |
| case 'l': |
| sscanf(optarg, "%d", &count); |
| break; |
| case 's': |
| sscanf(optarg, "%d", &msg_sz); |
| break; |
| case 'p': |
| sscanf(optarg, "%d", &port); |
| break; |
| case 'c': |
| sscanf(optarg, "%d", &num_addrs); |
| break; |
| case '?': |
| return usage(); |
| } |
| } |
| |
| if (!argv[optind]) |
| return usage(); |
| |
| start_addr = inet_addr(argv[optind]); |
| if (start_addr == INADDR_NONE) |
| return usage(); |
| end_addr = start_addr + num_addrs; |
| |
| return send_packets(start_addr, end_addr, port, count, msg_sz); |
| } |