aboutsummaryrefslogtreecommitdiff
path: root/clients
diff options
context:
space:
mode:
authorThomas Huth <thuth@redhat.com>2015-12-22 11:08:41 +0100
committerAlexey Kardashevskiy <aik@ozlabs.ru>2015-12-23 13:01:25 +1100
commitdef4d3e19798586e3313e3c065043f2e07e5ae7e (patch)
tree3062150c0a50216eb1a6d1a7b02112b1448f957b /clients
parent2c49891b555baa62ecd1b252317d6ebd1605579c (diff)
downloadSLOF-def4d3e19798586e3313e3c065043f2e07e5ae7e.zip
SLOF-def4d3e19798586e3313e3c065043f2e07e5ae7e.tar.gz
SLOF-def4d3e19798586e3313e3c065043f2e07e5ae7e.tar.bz2
net-snk: Make use of DHCPv6 transaction IDs
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@redhat.com> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Diffstat (limited to 'clients')
-rw-r--r--clients/net-snk/app/netapps/netboot.c3
-rw-r--r--clients/net-snk/app/netlib/dhcpv6.c17
-rw-r--r--clients/net-snk/app/netlib/dhcpv6.h1
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 74fc235..8592156 100644
--- a/clients/net-snk/app/netapps/netboot.c
+++ b/clients/net-snk/app/netapps/netboot.c
@@ -335,6 +335,9 @@ int dhcp(char *ret_buffer, filename_ip_t * fn_ip, unsigned int retries, int flag
printf(" Requesting information via DHCP%s: ",
flags == F_IPV4 ? "v4" : flags == F_IPV6 ? "v6" : "");
+ if (flags != F_IPV4)
+ dhcpv6_generate_transaction_id();
+
do {
printf("\b\b\b%03d", i-1);
if (getchar() == 27) {
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);