|
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__ */
|