Blame iscsiuio/src/apps/dhcpc/dhcpv6.h

Packit eace71
/*
Packit eace71
 * Copyright (c) 2011, Broadcom Corporation
Packit eace71
 * Copyright (c) 2014, QLogic Corporation
Packit eace71
 *
Packit eace71
 * Written by:  Eddie Wai <eddie.wai@broadcom.com>
Packit eace71
 *              Based on code from Kevin Tran's iSCSI boot code
Packit eace71
 *
Packit eace71
 * All rights reserved.
Packit eace71
 *
Packit eace71
 * Redistribution and use in source and binary forms, with or without
Packit eace71
 * modification, are permitted provided that the following conditions
Packit eace71
 * are met:
Packit eace71
 * 1. Redistributions of source code must retain the above copyright
Packit eace71
 *    notice, this list of conditions and the following disclaimer.
Packit eace71
 * 2. Redistributions in binary form must reproduce the above copyright
Packit eace71
 *    notice, this list of conditions and the following disclaimer in the
Packit eace71
 *    documentation and/or other materials provided with the distribution.
Packit eace71
 * 3. All advertising materials mentioning features or use of this software
Packit eace71
 *    must display the following acknowledgement:
Packit eace71
 *      This product includes software developed by Adam Dunkels.
Packit eace71
 * 4. The name of the author may not be used to endorse or promote
Packit eace71
 *    products derived from this software without specific prior
Packit eace71
 *    written permission.
Packit eace71
 *
Packit eace71
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
Packit eace71
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Packit eace71
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit eace71
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
Packit eace71
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit eace71
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
Packit eace71
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
Packit eace71
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
Packit eace71
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
Packit eace71
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Packit eace71
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit eace71
 *
Packit eace71
 * dhcpv6.h - DHCPv6 engine header
Packit eace71
 *
Packit eace71
 */
Packit eace71
#ifndef __IDHCPV6_H__
Packit eace71
#define __IDHCPV6_H__
Packit eace71
Packit eace71
#include "ipv6_ndpc.h"
Packit eace71
#include "ipv6.h"
Packit eace71
Packit eace71
#define ISCSI_MAX_ISCSI_NAME_LENGTH 128
Packit eace71
/* DHCPv6 Message types. */
Packit eace71
#define DHCPV6_SOLICIT               1
Packit eace71
#define DHCPV6_ADVERTISE             2
Packit eace71
#define DHCPV6_REQUEST               3
Packit eace71
#define DHCPV6_CONFIRM               4
Packit eace71
#define DHCPV6_RENEW                 5
Packit eace71
#define DHCPV6_REBIND                6
Packit eace71
#define DHCPV6_REPLY                 7
Packit eace71
#define DHCPV6_RELEASE               8
Packit eace71
#define DHCPV6_DECLINE               9
Packit eace71
#define DHCPV6_RECONFIGURE           10
Packit eace71
#define DHCPV6_INFO_REQUEST          11
Packit eace71
#define DHCPV6_RELAY_FORW            12
Packit eace71
#define DHCPV6_RELAY_REPL            13
Packit eace71
Packit eace71
/* Option codes. */
Packit eace71
#define DHCPV6_OPT_CLIENTID       1	/* Client ID option - built by stack */
Packit eace71
#define DHCPV6_OPT_SERVERID       2	/* Server ID option - built by stack */
Packit eace71
#define DHCPV6_OPT_IA_NA          3	/* IA_NA option - built by user */
Packit eace71
#define DHCPV6_OPT_IA_TA          4	/* IA_TA option - not supported */
Packit eace71
#define DHCPV6_OPT_IAADDR         5	/* IA_ADDR option - built by user */
Packit eace71
#define DHCPV6_OPT_ORO            6	/* Option Request Option - built by
Packit eace71
					   stack */
Packit eace71
#define DHCPV6_OPT_PREFERENCE     7	/* Preference option - built by server
Packit eace71
					   */
Packit eace71
#define DHCPV6_OPT_ELAPSED_TIME   8	/* Elapsed Time option - built by stack
Packit eace71
					   */
Packit eace71
#define DHCPV6_OPT_RELAY_MSG      9	/* Relay Message option - not supported
Packit eace71
					   */
Packit eace71
#define DHCPV6_OPT_AUTH           11	/* Authentication option - built by
Packit eace71
					   stack */
Packit eace71
#define DHCPV6_OPT_UNICAST        12	/* Server Unicast option - built by
Packit eace71
					   server */
Packit eace71
#define DHCPV6_OPT_STATUS_CODE    13	/* Status Code option - built by stack
Packit eace71
					   */
Packit eace71
#define DHCPV6_OPT_RAPID_COMMIT   14	/* Rapid Commit option - built by user
Packit eace71
					   */
Packit eace71
#define DHCPV6_OPT_USER_CLASS     15	/* User Class option - built by user */
Packit eace71
#define DHCPV6_OPT_VENDOR_CLASS   16	/* Vendor Class option - built by user
Packit eace71
					   */
Packit eace71
#define DHCPV6_OPT_VENDOR_OPTS    17	/* Vendor-Specific Information option -
Packit eace71
					   build by user */
Packit eace71
#define DHCPV6_OPT_INTERFACE_ID   18	/* Interface ID option - not supported
Packit eace71
					   */
Packit eace71
#define DHCPV6_OPT_RECONF_MSG     19	/* Reconfigure Message option - built
Packit eace71
					   by server */
Packit eace71
#define DHCPV6_OPT_RECONF_ACCEPT  20	/* Reconfigure Accept option - built by
Packit eace71
					   user */
Packit eace71
#define DHCPV6_OPT_SIP_SERVER_D   21	/* NOT SUPPORTED - included for
Packit eace71
					   completeness only */
Packit eace71
#define DHCPV6_OPT_SIP_SERVER_A   22	/* NOT SUPPORTED - included for
Packit eace71
					   completeness only */
Packit eace71
#define DHCPV6_OPT_DNS_SERVERS    23	/* DNS Recursive Name Server option -
Packit eace71
					   built by server */
Packit eace71
#define DHCPV6_OPT_DOMAIN_LIST    24	/* Domain Search List option - not
Packit eace71
					   supported */
Packit eace71
#define DHCPV6_MAX_OPT_CODES      25	/* This will be the count + 1 since
Packit eace71
					   the parsing array starts
Packit eace71
					   at [1] instead of [0] */
Packit eace71
Packit eace71
/* Authentication protocol types. */
Packit eace71
#define DHCPV6_DELAYED_AUTH_PROT     2	/* Delayed Authentication protocol. */
Packit eace71
#define DHCPV6_RECON_KEY_AUTH_PROT   3	/* Reconfigure Key Authentication
Packit eace71
					   protocol. */
Packit eace71
Packit eace71
struct dhcpv6_context {
Packit eace71
#define DHCP_VENDOR_ID_LEN 128
Packit eace71
	char dhcp_vendor_id[DHCP_VENDOR_ID_LEN];
Packit eace71
	struct mac_address *our_mac_addr;
Packit eace71
	u32_t dhcpv6_transaction_id;
Packit eace71
	u16_t seconds;
Packit eace71
	int timeout;
Packit eace71
	int dhcpv6_done;
Packit eace71
Packit eace71
#define DHCPV6_STATE_UNKNOWN       0
Packit eace71
#define DHCPV6_STATE_SOLICIT_SENT  1
Packit eace71
#define DHCPV6_STATE_ADV_RCVD      2
Packit eace71
#define DHCPV6_STATE_REQ_SENT      3
Packit eace71
#define DHCPV6_STATE_CONFIRM_SENT  4
Packit eace71
	int dhcpv6_state;
Packit eace71
	u16_t dhcpv6_task;
Packit eace71
	struct ipv6_context *ipv6_context;
Packit eace71
	struct eth_hdr *eth;
Packit eace71
	struct ipv6_hdr *ipv6;
Packit eace71
	struct udp_hdr *udp;
Packit eace71
Packit eace71
	char initiatorName[ISCSI_MAX_ISCSI_NAME_LENGTH];
Packit eace71
	struct ipv6_addr dhcp_server;
Packit eace71
	struct ipv6_addr primary_dns_server;
Packit eace71
	struct ipv6_addr secondary_dns_server;
Packit eace71
Packit eace71
};
Packit eace71
Packit eace71
union dhcpv6_hdr {
Packit eace71
	struct {
Packit eace71
		u32_t type:8;
Packit eace71
		u32_t trans_id:24;
Packit eace71
	} field;
Packit eace71
Packit eace71
	u32_t type_transaction;
Packit eace71
};
Packit eace71
Packit eace71
#define dhcpv6_type      field.type
Packit eace71
#define dhcpv6_trans_id  field.trans_id
Packit eace71
Packit eace71
struct dhcpv6_opt_hdr {
Packit eace71
	u16_t type;
Packit eace71
	u16_t length;
Packit eace71
};
Packit eace71
Packit eace71
struct dhcpv6_opt_client_id {
Packit eace71
	u16_t duid_type;
Packit eace71
#define DHCPV6_DUID_TYPE_LINK_LAYER_AND_TIME 1
Packit eace71
#define DHCPV6_DUID_TYPE_VENDOR_BASED        2
Packit eace71
#define DHCPV6_DUID_TYPE_LINK_LAYER          3
Packit eace71
	u16_t hw_type;
Packit eace71
#define DHCPV6_HW_TYPE_ETHERNET              1
Packit eace71
	u32_t time;
Packit eace71
	struct mac_address link_layer_addr;
Packit eace71
};
Packit eace71
Packit eace71
struct dhcpv6_opt_id_assoc_na {
Packit eace71
	u32_t iaid;
Packit eace71
#define DHCPV6_OPT_IA_NA_IAID  0x306373L
Packit eace71
	u32_t t1;
Packit eace71
	u32_t t2;
Packit eace71
};
Packit eace71
Packit eace71
struct dhcpv6_opt_elapse_time {
Packit eace71
	u16_t time;
Packit eace71
};
Packit eace71
Packit eace71
struct dhcpv6_opt_iaa_addr {
Packit eace71
	struct ipv6_addr addr;
Packit eace71
	u32_t preferred_lifetime;
Packit eace71
	u32_t valid_lifetime;
Packit eace71
};
Packit eace71
Packit eace71
struct dhcpv6_opt_status {
Packit eace71
	u16_t status;
Packit eace71
};
Packit eace71
Packit eace71
struct dhcpv6_opt_request_list {
Packit eace71
	u16_t request_code[1];
Packit eace71
};
Packit eace71
Packit eace71
struct dhcpv6_opt_dns {
Packit eace71
	struct ipv6_addr primary_addr;
Packit eace71
	struct ipv6_addr secondary_addr;
Packit eace71
};
Packit eace71
Packit eace71
struct dhcpv6_vendor_class {
Packit eace71
	u32_t enterprise_number;
Packit eace71
	u16_t vendor_class_length;
Packit eace71
	u8_t vendor_class_data[1];
Packit eace71
};
Packit eace71
Packit eace71
struct dhcpv6_vendor_opts {
Packit eace71
	u32_t enterprise_number;
Packit eace71
	u8_t vendor_opt_data[1];
Packit eace71
};
Packit eace71
Packit eace71
struct dhcpv6_option {
Packit eace71
	struct dhcpv6_opt_hdr hdr;
Packit eace71
	union {
Packit eace71
		struct dhcpv6_vendor_opts vendor_opts;
Packit eace71
		struct dhcpv6_vendor_class vendor_class;
Packit eace71
		struct dhcpv6_opt_client_id client_id;
Packit eace71
		struct dhcpv6_opt_id_assoc_na ida_na;
Packit eace71
		struct dhcpv6_opt_elapse_time elapsed_time;
Packit eace71
		struct dhcpv6_opt_iaa_addr iaa_addr;
Packit eace71
		struct dhcpv6_opt_status sts;
Packit eace71
		struct dhcpv6_opt_request_list list;
Packit eace71
		struct dhcpv6_opt_dns dns;
Packit eace71
		u8_t data[1];
Packit eace71
	} type;
Packit eace71
};
Packit eace71
Packit eace71
#define DHCPV6_NUM_OF_RETRY      4
Packit eace71
Packit eace71
#define DHCPV6_ACK_TIMEOUT       2
Packit eace71
Packit eace71
#define IANA_ENTERPRISE_NUM_BROADCOM   0x113d
Packit eace71
Packit eace71
/* QLogic Extended DHCP options used in iSCSI boot */
Packit eace71
#define DHCPV6_TAG_FIRST_ISCSI_TARGET_NAME              201
Packit eace71
#define DHCPV6_TAG_SECOND_ISCSI_TARGET_NAME             202
Packit eace71
#define DHCPV6_TAG_ISCSI_INITIATOR_NAME                 203
Packit eace71
Packit eace71
#define MAX_DHCP_RX_OFFERS   4
Packit eace71
#define MAX_DHCP_OPTION43_LENGTH  1024
Packit eace71
Packit eace71
#define DHCPV6_TASK_GET_IP_ADDRESS   0x1
Packit eace71
#define DHCPV6_TASK_GET_OTHER_PARAMS 0x2
Packit eace71
Packit eace71
enum {
Packit eace71
	ISCSI_FAILURE,
Packit eace71
	ISCSI_USER_ABORT,
Packit eace71
	ISCSI_SUCCESS
Packit eace71
};
Packit eace71
Packit eace71
/* Function prototypes */
Packit eace71
int dhcpv6_do_discovery(struct dhcpv6_context *context);
Packit eace71
void ipv6_udp_handle_dhcp(struct dhcpv6_context *context);
Packit eace71
void dhcpv6_init(struct dhcpv6_context *context);
Packit eace71
Packit eace71
#endif /* __IDHCPV6_H__ */