| /****************************************************************************** |
| * Copyright (c) 2013 IBM Corporation |
| * All rights reserved. |
| * This program and the accompanying materials |
| * are made available under the terms of the BSD License |
| * which accompanies this distribution, and is available at |
| * http://www.opensource.org/licenses/bsd-license.php |
| * |
| * Contributors: |
| * IBM Corporation - initial implementation |
| *****************************************************************************/ |
| |
| #ifndef _DHCPV6_H_ |
| #define _DHCPV6_H_ |
| |
| #include <stdint.h> |
| #include "ethernet.h" |
| |
| #define DHCPV6_STATELESS 0 |
| #define DHCPV6_STATEFUL 1 |
| |
| /* DHCP port numbers */ |
| #define DHCP_CLIENT_PORT 546 |
| #define DHCP_SERVER_PORT 547 |
| |
| /* DHCPv6 message types */ |
| #define DHCP_SOLICIT 1 |
| #define DHCP_ADVERTISE 2 |
| #define DHCP_REQUEST 3 |
| #define DHCP_CONFIRM 4 |
| #define DHCP_RENEW 5 |
| #define DHCP_REBIND 6 |
| #define DHCP_REPLY 7 |
| #define DHCP_RELEASE 8 |
| #define DHCP_DECLINE 9 |
| #define DHCP_RECONFIGURE 10 |
| #define DHCP_INFORMATION_REQUEST 11 |
| #define RELAY_FORW 12 |
| #define RELAY_REPL 13 |
| |
| /* DHCPv6 option types */ |
| #define DHCPV6_OPTION_CLIENTID 0x0001 |
| #define DHCPV6_OPTION_SERVERID 0x0002 |
| #define DHCPV6_OPTION_IA_NA 3 |
| #define DHCPV6_OPTION_IA_TA 4 |
| #define DHCPV6_OPTION_IAADDR 5 |
| #define DHCPV6_OPTION_ORO 6 |
| #define DHCPV6_OPTION_PREFEREN 7 |
| #define DHCPV6_OPTION_ELAPSED_TIME 8 |
| #define DHCPV6_OPTION_RELAY_MS 9 |
| #define DHCPV6_OPTION_AUTH 11 |
| #define DHCPV6_OPTION_UNICAST 12 |
| #define DHCPV6_OPTION_STATUS_C 13 |
| #define DHCPV6_OPTION_RAPID_CO 14 |
| #define DHCPV6_OPTION_USER_CLA 15 |
| #define DHCPV6_OPTION_VENDOR_C 16 |
| #define DHCPV6_OPTION_VENDOR_O 17 |
| #define DHCPV6_OPTION_INTERFAC 18 |
| #define DHCPV6_OPTION_RECONF_M 19 |
| #define DHCPV6_OPTION_RECONF_A 20 |
| #define DHCPV6_OPTION_DNS_SERVERS 23 |
| #define DHCPV6_OPTION_DOMAIN_LIST 24 |
| #define DHCPV6_OPTION_BOOT_URL 59 |
| |
| /* DHCPv6 status codes */ |
| #define DHCP_STATUSCODE_SUCCESS 0 |
| #define DHCP_STATUSCODE_UNSPECFAIL 1 |
| #define DHCP_STATUSCODE_NOADDRAVAIL 2 |
| #define DHCP_STATUSCODE_NOBINDING 3 |
| #define DHCP_STATUSCODE_NOTONLINK 4 |
| #define DHCP_STATUSCODE_USEMULTICAST 5 |
| #define DHCPV6_STATE_SELECT 6 |
| |
| /* DUID types */ |
| #define DUID_LLT 1 /* DUID based on Link-layer Address Plus Time */ |
| #define DUID_EN 2 /* DUID based on Assigned by Vendor Based on Enterprise Number */ |
| #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); |
| |
| struct dhcp6_gen_option { |
| uint16_t code; |
| uint16_t length; |
| }; |
| |
| struct client_identifier { |
| uint16_t code; |
| uint16_t length; |
| uint16_t duid_type; |
| uint16_t hardware_type; |
| uint8_t mac[6]; |
| }; |
| |
| struct server_identifier { |
| uint16_t code; |
| uint16_t length; |
| uint16_t duid_type; |
| uint16_t hardware_type; |
| uint32_t time; |
| uint8_t mac[6]; |
| }; |
| |
| #define DHCPV6_OPTREQUEST_NUMOPTS 3 |
| |
| struct dhcp_info_request { |
| struct client_identifier client_id; |
| struct elapsed_time { |
| uint16_t code; |
| uint16_t length; |
| uint16_t time; |
| } el_time; |
| struct option_request { |
| uint16_t code; |
| uint16_t length; |
| uint16_t option_code[DHCPV6_OPTREQUEST_NUMOPTS]; |
| } option_request_option; |
| }; |
| |
| struct dhcp_message_header { |
| uint8_t type; /* Message type */ |
| uint8_t transaction_id[3]; /* Transaction id */ |
| struct dhcp_info_request option; |
| }; |
| |
| struct dhcp_dns { |
| uint16_t code; |
| uint16_t length; |
| uint8_t p_ip6[16]; |
| uint8_t s_ip6[16]; |
| }__attribute((packed)); |
| |
| struct dhcp_dns_list { |
| uint16_t code; |
| uint16_t length; |
| uint8_t domain[256]; |
| }__attribute((packed)); |
| |
| struct dhcp_boot_url { |
| uint16_t type; |
| uint16_t length; |
| uint8_t url[256]; |
| }; |
| |
| struct dhcp_message_reply { |
| uint8_t type; /* Message type */ |
| uint8_t transaction_id[3]; /* Transaction id */ |
| struct client_identifier client_id; |
| struct server_identifier server_id; |
| }; |
| |
| #endif |