summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Klauser <tklauser@distanz.ch>2016-08-02 14:00:54 +0200
committerTobias Klauser <tklauser@distanz.ch>2016-08-02 14:00:54 +0200
commita52e1267020bdf9816219b44d1cf1ba717821f64 (patch)
tree96c0286d14c63761af68ac11d152974797194635
parentc53e9b86ae702272e5121d3e06d02c9eafacd929 (diff)
llmnr-query: Allow to set LLMNR transaction id
Allow to override the transaction id in the LLMNR query header. Default value is 0. The id will be incremented for consecutive queries (i.e. count > 1). Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
-rw-r--r--llmnr-query.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/llmnr-query.c b/llmnr-query.c
index e35a00e..fefcf0b 100644
--- a/llmnr-query.c
+++ b/llmnr-query.c
@@ -36,9 +36,10 @@
#include "log.h"
#include "pkt.h"
-static const char *short_ops = "c:i:I:t:T:6hV";
+static const char *short_ops = "c:d:i:I:t:T:6hV";
static const struct option long_opts[] = {
{ "count", required_argument, NULL, 'c' },
+ { "id", required_argument, NULL, 'd' },
{ "interval", required_argument, NULL, 'i' },
{ "interface", required_argument, NULL, 'I' },
{ "timeout", required_argument, NULL, 't' },
@@ -54,6 +55,7 @@ static void __noreturn usage_and_exit(int status)
fprintf(stdout, "Usage: llmnr-query [OPTIONS...] NAME\n"
"Options:\n"
" -c, --count NUM number of queries to send (default: 1)\n"
+ " -d, --id NUM set LLMNR transaction id (default: 0)\n"
" -i, --interval NUM interval between queries in ms (default: 500)\n"
" -I, --interface NAME send multicast over specified interface\n"
" -t, --timeout NUM time to wait for reply in ms (default: 1000)\n"
@@ -92,7 +94,7 @@ int main(int argc, char **argv)
int c, sock;
const char *query_name, *iface = NULL;
size_t query_name_len;
- unsigned long i, count = 1, interval_ms = 500, timeout_ms = 1000;
+ unsigned long i, id = 0, count = 1, interval_ms = 500, timeout_ms = 1000;
uint16_t qtype = LLMNR_QTYPE_ANY;
bool ipv6 = false;
struct pkt *p;
@@ -103,6 +105,9 @@ int main(int argc, char **argv)
case 'c':
count = strtoul(optarg, NULL, 0);
break;
+ case 'd':
+ id = strtoul(optarg, NULL, 0);
+ break;
case 'i':
interval_ms = strtoul(optarg, NULL, 0);
break;
@@ -217,7 +222,7 @@ int main(int argc, char **argv)
int ret;
hdr = (struct llmnr_hdr *)pkt_put(p, sizeof(*hdr));
- hdr->id = htons(i % UINT16_MAX);
+ hdr->id = htons(id + i % UINT16_MAX);
hdr->flags = 0;
hdr->qdcount = htons(1);
hdr->ancount = 0;