[SLOF] [PATCH 5/7] net-snk: Make use of DHCPv6 transaction IDs

Thomas Huth thuth at redhat.com
Fri Dec 18 07:18:54 AEDT 2015


Generate a proper transaction ID before sending DHCPv6 packets
and check whether the DHCPv6 replies contain that correct XID, too.

Signed-off-by: Thomas Huth <thuth at redhat.com>
---
 clients/net-snk/app/netapps/netboot.c |  3 +++
 clients/net-snk/app/netlib/dhcpv6.c   | 17 +++++++++--------
 clients/net-snk/app/netlib/dhcpv6.h   |  1 +
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/clients/net-snk/app/netapps/netboot.c b/clients/net-snk/app/netapps/netboot.c
index 51189c4..d51d5a8 100644
--- a/clients/net-snk/app/netapps/netboot.c
+++ b/clients/net-snk/app/netapps/netboot.c
@@ -332,6 +332,9 @@ int dhcp(char *ret_buffer, filename_ip_t * fn_ip, unsigned int retries, int flag
 	int i = (int) retries+1;
 	int rc = -1;
 
+	if (flags != F_IPV4)
+		dhcpv6_generate_transaction_id();
+
 	printf("    ");
 
 	do {
diff --git a/clients/net-snk/app/netlib/dhcpv6.c b/clients/net-snk/app/netlib/dhcpv6.c
index 4deef30..05e9fcd 100644
--- a/clients/net-snk/app/netlib/dhcpv6.c
+++ b/clients/net-snk/app/netlib/dhcpv6.c
@@ -27,13 +27,13 @@ static uint8_t tid[3];
 static uint32_t dhcpv6_state = -1;
 static filename_ip_t *my_fn_ip;
 
-static void
-generate_transaction_id(void)
+void
+dhcpv6_generate_transaction_id(void)
 {
-	/* TODO: as per RFC 3315 transaction IDs should be generated randomly */
-	tid[0] = 1;
-	tid[1] = 2;
-	tid[2] = 4;
+	/* As per RFC 3315 transaction IDs should be generated randomly */
+	tid[0] = rand();
+	tid[1] = rand();
+	tid[2] = rand();
 }
 
 static void
@@ -45,8 +45,6 @@ send_info_request(int fd)
 
 	memset(ether_packet, 0, ETH_MTU_SIZE);
 
-	generate_transaction_id();
-
 	/* Get an IPv6 packet */
 	payload_length = sizeof(struct udphdr) + sizeof(struct dhcp_message_header);
 	fill_ip6hdr (ether_packet + sizeof(struct ethhdr),
@@ -205,6 +203,9 @@ handle_dhcpv6(uint8_t * packet, int32_t packetsize)
 	struct dhcp_message_reply *reply;
 	reply = (struct dhcp_message_reply *) packet;
 
+	if (memcmp(reply->transaction_id, tid, 3))
+		return -1;			/* Wrong transaction ID */
+
 	if (reply->type == 7)
 		dhcpv6_state = DHCP_STATUSCODE_SUCCESS;
 
diff --git a/clients/net-snk/app/netlib/dhcpv6.h b/clients/net-snk/app/netlib/dhcpv6.h
index 078a9f1..dcda9b1 100644
--- a/clients/net-snk/app/netlib/dhcpv6.h
+++ b/clients/net-snk/app/netlib/dhcpv6.h
@@ -77,6 +77,7 @@
 #define DUID_LL		3 /* DUID based on Link-layer Address */
 
 /* Prototypes */
+void dhcpv6_generate_transaction_id(void);
 int32_t dhcpv6 ( char *ret_buffer, void *fn_ip);
 uint32_t handle_dhcpv6(uint8_t * , int32_t);
 
-- 
1.8.3.1



More information about the SLOF mailing list