Index: uspace/srv/net/dhcp/dhcp.c
===================================================================
--- uspace/srv/net/dhcp/dhcp.c	(revision 52214a2d97559c2396ecbcd3de80863dab438fb3)
+++ uspace/srv/net/dhcp/dhcp.c	(revision bbb7ffe3129f8c25918c4539f76cc52eaff0d1dd)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2022 Jiri Svoboda
  * All rights reserved.
  *
@@ -47,4 +47,5 @@
 #include <io/log.h>
 #include <loc.h>
+#include <rndgen.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -95,4 +96,6 @@
 	/** DNS server */
 	inet_addr_t dns_server;
+	/** Transaction ID */
+	uint32_t xid;
 } dhcp_offer_t;
 
@@ -114,4 +117,6 @@
 	/** Last received offer */
 	dhcp_offer_t offer;
+	/** Random number generator */
+	rndgen_t *rndgen;
 } dhcp_link_t;
 
@@ -154,4 +159,10 @@
 	dhcp_hdr_t *hdr = (dhcp_hdr_t *)msgbuf;
 	uint8_t *opt = msgbuf + sizeof(dhcp_hdr_t);
+	uint32_t xid;
+	errno_t rc;
+
+	rc = rndgen_uint32(dlink->rndgen, &xid);
+	if (rc != EOK)
+		return rc;
 
 	memset(msgbuf, 0, MAX_MSG_SIZE);
@@ -159,6 +170,6 @@
 	hdr->htype = 1; /* AHRD_ETHERNET */
 	hdr->hlen = ETH_ADDR_SIZE;
-	hdr->xid = host2uint32_t_be(42);
-	hdr->flags = flag_broadcast;
+	hdr->xid = host2uint32_t_be(xid);
+	hdr->flags = host2uint16_t_be(flag_broadcast);
 
 	eth_addr_encode(&dlink->link_info.mac_addr, hdr->chaddr);
@@ -168,4 +179,5 @@
 	opt[1] = 1;
 	opt[2] = msg_dhcpdiscover;
+
 	opt[3] = opt_end;
 
@@ -183,6 +195,6 @@
 	hdr->htype = 1; /* AHRD_ETHERNET */
 	hdr->hlen = 6;
-	hdr->xid = host2uint32_t_be(42);
-	hdr->flags = flag_broadcast;
+	hdr->xid = host2uint32_t_be(offer->xid);
+	hdr->flags = host2uint16_t_be(flag_broadcast);
 	eth_addr_encode(&dlink->link_info.mac_addr, hdr->chaddr);
 	hdr->opt_magic = host2uint32_t_be(dhcp_opt_magic);
@@ -257,4 +269,5 @@
 
 	inet_naddr_set(yiaddr.addr, 0, &offer->oaddr);
+	offer->xid = uint32_t_be2host(hdr->xid);
 
 	msgb = (uint8_t *)msg;
@@ -456,4 +469,8 @@
 		return ENOMEM;
 
+	rc = rndgen_create(&dlink->rndgen);
+	if (rc != EOK)
+		goto error;
+
 	dlink->link_id = link_id;
 	dlink->timeout = fibril_timer_create(NULL);
@@ -493,4 +510,6 @@
 	return EOK;
 error:
+	if (dlink != NULL && dlink->rndgen != NULL)
+		rndgen_destroy(dlink->rndgen);
 	if (dlink != NULL && dlink->timeout != NULL)
 		fibril_timer_destroy(dlink->timeout);
Index: uspace/srv/net/dhcp/dhcp_std.h
===================================================================
--- uspace/srv/net/dhcp/dhcp_std.h	(revision 52214a2d97559c2396ecbcd3de80863dab438fb3)
+++ uspace/srv/net/dhcp/dhcp_std.h	(revision bbb7ffe3129f8c25918c4539f76cc52eaff0d1dd)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2013 Jiri Svoboda
+ * Copyright (c) 2022 Jiri Svoboda
  * All rights reserved.
  *
@@ -87,5 +87,5 @@
 /** Values for dhcp_hdr_t.flags */
 enum dhcp_flags {
-	flag_broadcast = 0x80
+	flag_broadcast = 0x8000
 };
 
