diff --git a/src/utils/knot-xdp-gun/main.c b/src/utils/knot-xdp-gun/main.c
index 35c86b55c09c68c02737ab133e8a9cc86b3eb0fa..eaaf75a5ec17e934b17e1b8af16e2c4c57003355 100644
--- a/src/utils/knot-xdp-gun/main.c
+++ b/src/utils/knot-xdp-gun/main.c
@@ -43,6 +43,8 @@
 
 #define PROGRAM_NAME "knot-xdp-gun"
 
+#define TRANSACTION_ID htobe16(0xbaf8) // entirely arbitrary magic constant to distinguish from other traffic
+
 volatile bool xdp_trigger = false;
 
 pthread_mutex_t global_mutex;
@@ -107,11 +109,6 @@ static void set_sockaddr6(void *sa_in, struct in6_addr *addr, uint16_t port)
 	saddr->sin6_addr = *addr;
 }
 
-inline static void set_pkt_vars(struct iovec pkt, uint16_t ord)
-{
-	*(uint16_t *)(pkt.iov_base + 0) = htobe16(ord); // transaction ID
-}
-
 static void next_payload(struct pkt_payload **payload, int increment)
 {
 	if (*payload == NULL) {
@@ -152,7 +149,7 @@ static int alloc_pkts(knot_xdp_msg_t *pkts, int npkts, struct knot_xdp_socket *x
 		memcpy(pkts[i].payload.iov_base, (*payl)->payload, (*payl)->len);
 		pkts[i].payload.iov_len = (*payl)->len;
 
-		set_pkt_vars(pkts[i].payload, unique & 0xffff);
+		*(uint16_t *)(pkts[i].payload.iov_base + 0) = TRANSACTION_ID;
 
 		unique++;
 		next_payload(payl, ctx->n_threads);
@@ -243,7 +240,8 @@ void *xdp_gun_thread(void *_ctx)
 				}
 				for (int i = 0; i < recvd; i++) {
 					tot_size += pkts[i].payload.iov_len;
-					if (pkts[i].payload.iov_len < KNOT_WIRE_HEADER_SIZE) {
+					if (pkts[i].payload.iov_len < KNOT_WIRE_HEADER_SIZE ||
+					    *(uint16_t *)(pkts[i].payload.iov_base + 0) != TRANSACTION_ID) {
 						ctx->rcode_counts[KNOWN_RCODE_MAX - 1]++;
 					} else {
 						ctx->rcode_counts[((uint8_t *)pkts[i].payload.iov_base)[3] & 0xf]++;