blob: 02747a0e70a2359a1490aa91c564a23ff296d501 [file] [log] [blame]
/******************************************************************************
* 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