diff options
author | Thomas Huth <thuth@redhat.com> | 2015-12-22 11:08:41 +0100 |
---|---|---|
committer | Alexey Kardashevskiy <aik@ozlabs.ru> | 2015-12-23 13:01:25 +1100 |
commit | def4d3e19798586e3313e3c065043f2e07e5ae7e (patch) | |
tree | 3062150c0a50216eb1a6d1a7b02112b1448f957b /clients | |
parent | 2c49891b555baa62ecd1b252317d6ebd1605579c (diff) | |
download | SLOF-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.c | 3 | ||||
-rw-r--r-- | clients/net-snk/app/netlib/dhcpv6.c | 17 | ||||
-rw-r--r-- | 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 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); |