From 7572cbb0a65b6f710aa35be0ba58b011843a0890 Mon Sep 17 00:00:00 2001 From: volker Date: Thu, 7 Dec 2023 17:15:16 +0100 Subject: [PATCH 1/3] Added cmd line options to set destination ip and port --- src/udpreplay.cpp | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/udpreplay.cpp b/src/udpreplay.cpp index dc61f2a..11f0d62 100644 --- a/src/udpreplay.cpp +++ b/src/udpreplay.cpp @@ -23,8 +23,13 @@ int main(int argc, char *argv[]) { int ttl = -1; int broadcast = 0; + sockaddr_in dest_addr; + memset(&dest_addr, 0, sizeof(dest_addr)); + dest_addr.sin_family = AF_INET; + int opt; - while ((opt = getopt(argc, argv, "i:bls:c:r:t:")) != -1) { + + while ((opt = getopt(argc, argv, "i:bls:c:r:t:d:p:")) != -1) { switch (opt) { case 'i': ifindex = if_nametoindex(optarg); @@ -63,6 +68,25 @@ int main(int argc, char *argv[]) { return 1; } break; + case 'd': + // convert string to sockaddr_in + dest_addr.sin_addr.s_addr = inet_addr(optarg); + if (dest_addr.sin_addr.s_addr == INADDR_NONE) { + std::cerr << "Invalid IP address" << std::endl; + return 1; + } + break; + case 'p': + { + // convert string to port number + int port = atoi(optarg); + if (port < 0 || port > 65535) { + std::cerr << "Invalid port number" << std::endl; + return 1; + } + dest_addr.sin_port = htons(atoi(optarg)); + break; + } case 'b': broadcast = 1; break; @@ -247,14 +271,22 @@ int main(int argc, char *argv[]) { sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; -#ifdef __GLIBC__ - addr.sin_port = udp->dest; + if (dest_addr.sin_port != 0) { + addr.sin_port = dest_addr.sin_port; + } else { +#ifdef __GLIBC__ + addr.sin_port = udp->dest; #else - addr.sin_port = udp->uh_dport; + addr.sin_port = udp->uh_dport; #endif - addr.sin_addr = {ip->ip_dst}; - auto n = sendto(fd, d, len, 0, reinterpret_cast(&addr), - sizeof(addr)); + } + + if (dest_addr.sin_addr.s_addr != 0) { + addr.sin_addr = dest_addr.sin_addr; + } else { + addr.sin_addr = {ip->ip_dst}; + } + auto n = sendto(fd, d, len, 0, reinterpret_cast(&addr), sizeof(addr)); if (n != len) { std::cerr << "sendto: " << strerror(errno) << std::endl; return 1; From 20f9aa852f0af4ebd9bb9f9e45a1b84e38598292 Mon Sep 17 00:00:00 2001 From: volker Date: Thu, 7 Dec 2023 17:18:22 +0100 Subject: [PATCH 2/3] added help output --- src/udpreplay.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/udpreplay.cpp b/src/udpreplay.cpp index 11f0d62..3c3cdc4 100644 --- a/src/udpreplay.cpp +++ b/src/udpreplay.cpp @@ -109,7 +109,9 @@ int main(int argc, char *argv[]) { " -r repeat number of times to loop data (-1 for infinite loop)\n" " -s speed replay speed relative to pcap timestamps\n" " -t ttl packet ttl\n" - " -b enable broadcast (SO_BROADCAST)" + " -b enable broadcast (SO_BROADCAST)\n" + " -d ip destination ip address\n" + " -p port destination port number" << std::endl; return 1; } From 87025302ff722f807ef7840b5434dadb02eeb9e8 Mon Sep 17 00:00:00 2001 From: volker Date: Thu, 7 Dec 2023 17:19:11 +0100 Subject: [PATCH 3/3] added help output --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 765a876..d0d23ed 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ usage: udpreplay [-i iface] [-l] [-s speed] [-c millisec] [-r repeat] [-t ttl] p -s speed replay speed relative to pcap timestamps -t ttl packet ttl -b enable broadcast (SO_BROADCAST) + -d ip destination ip address + -p port destination port number ``` ## Example