1
0
This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
TP-Link_Archer-XR500v/BBA1.5_platform/apps/public/wide-dhcpv6-20080615/dhcp6.h
2024-07-22 01:58:46 -03:00

406 lines
12 KiB
C

/* $KAME: dhcp6.h,v 1.56 2005/03/20 06:46:09 jinmei Exp $ */
/*
* Copyright (C) 1998 and 1999 WIDE Project.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef __DHCP6_H_DEFINED
#define __DHCP6_H_DEFINED
#ifdef __sun__
#define __P(x) x
typedef uint8_t u_int8_t;
#ifndef U_INT16_T_DEFINED
#define U_INT16_T_DEFINED
typedef uint16_t u_int16_t;
#endif
#ifndef U_INT32_T_DEFINED
#define U_INT32_T_DEFINED
typedef uint32_t u_int32_t;
#endif
typedef uint64_t u_int64_t;
#ifndef CMSG_SPACE
#define CMSG_SPACE(l) \
((unsigned int)_CMSG_HDR_ALIGN(sizeof (struct cmsghdr) + (l)))
#endif
#ifndef CMSG_LEN
#define CMSG_LEN(l) \
((unsigned int)_CMSG_DATA_ALIGN(sizeof (struct cmsghdr)) + (l))
#endif
#endif
/* Error Values */
#define DH6ERR_FAILURE 16
#define DH6ERR_AUTHFAIL 17
#define DH6ERR_POORLYFORMED 18
#define DH6ERR_UNAVAIL 19
#define DH6ERR_OPTUNAVAIL 20
/* Message type */
#define DH6_SOLICIT 1
#define DH6_ADVERTISE 2
#define DH6_REQUEST 3
#define DH6_CONFIRM 4
#define DH6_RENEW 5
#define DH6_REBIND 6
#define DH6_REPLY 7
#define DH6_RELEASE 8
#define DH6_DECLINE 9
#define DH6_RECONFIGURE 10
#define DH6_INFORM_REQ 11
#define DH6_RELAY_FORW 12
#define DH6_RELAY_REPLY 13
/* Predefined addresses */
#define DH6ADDR_ALLAGENT "ff02::1:2"
#define DH6ADDR_ALLSERVER "ff05::1:3"
#define DH6PORT_DOWNSTREAM "546"
#define DH6PORT_UPSTREAM "547"
/* Protocol constants */
/* timer parameters (msec, unless explicitly commented) */
#define SOL_MAX_DELAY 1000
#define SOL_TIMEOUT 1000
#define SOL_MAX_RT 120000
#define INF_TIMEOUT 1000
#define INF_MAX_RT 120000
#define REQ_TIMEOUT 1000
#define REQ_MAX_RT 30000
#define REQ_MAX_RC 10 /* Max Request retry attempts */
#define REN_TIMEOUT 10000 /* 10secs */
#define REN_MAX_RT 600000 /* 600secs */
#define REB_TIMEOUT 10000 /* 10secs */
#define REB_MAX_RT 600000 /* 600secs */
#define REL_TIMEOUT 1000 /* 1 sec */
#define REL_MAX_RC 5
#define DEC_TIMEOUT 1000 /* 1 sec */
#define DEC_MAX_RC 5
#define DHCP6_DURATION_INFINITE 0xffffffff
#define DHCP6_DURATION_MIN 30
#define DHCP6_RELAY_MULTICAST_HOPS 32
#define DHCP6_RELAY_HOP_COUNT_LIMIT 32
#define DHCP6_IRT_DEFAULT 86400 /* 1 day */
#define DHCP6_IRT_MINIMUM 600
/* DUID: DHCP unique Identifier */
struct duid {
size_t duid_len; /* length */
char *duid_id; /* variable length ID value (must be opaque) */
};
struct dhcp6_vbuf { /* generic variable length buffer */
int dv_len;
caddr_t dv_buf;
};
/* option information */
struct dhcp6_ia { /* identity association */
u_int32_t iaid;
u_int32_t t1;
u_int32_t t2;
};
struct dhcp6_prefix { /* IA_PA */
u_int32_t pltime;
u_int32_t vltime;
struct in6_addr addr;
int plen;
};
struct dhcp6_statefuladdr { /* IA_NA */
u_int32_t pltime;
u_int32_t vltime;
struct in6_addr addr;
};
/* Internal data structure */
typedef enum { DHCP6_LISTVAL_NUM = 1,
DHCP6_LISTVAL_STCODE, DHCP6_LISTVAL_ADDR6,
DHCP6_LISTVAL_IAPD, DHCP6_LISTVAL_PREFIX6,
DHCP6_LISTVAL_IANA, DHCP6_LISTVAL_STATEFULADDR6,
DHCP6_LISTVAL_VBUF
} dhcp6_listval_type_t;
TAILQ_HEAD(dhcp6_list, dhcp6_listval);
struct dhcp6_listval {
TAILQ_ENTRY(dhcp6_listval) link;
dhcp6_listval_type_t type;
union {
int uv_num;
u_int16_t uv_num16;
struct in6_addr uv_addr6;
struct dhcp6_prefix uv_prefix6;
struct dhcp6_statefuladdr uv_statefuladdr6;
struct dhcp6_ia uv_ia;
struct dhcp6_vbuf uv_vbuf;
} uv;
struct dhcp6_list sublist;
};
#define val_num uv.uv_num
#define val_num16 uv.uv_num16
#define val_addr6 uv.uv_addr6
#define val_ia uv.uv_ia
#define val_prefix6 uv.uv_prefix6
#define val_statefuladdr6 uv.uv_statefuladdr6
#define val_vbuf uv.uv_vbuf
struct dhcp6_optinfo {
struct duid clientID; /* DUID */
struct duid serverID; /* DUID */
int rapidcommit; /* bool */
int pref; /* server preference */
int32_t elapsed_time; /* elapsed time (from client to server only) */
int64_t refreshtime; /* info refresh time for stateless options */
struct dhcp6_list iapd_list; /* list of IA_PD */
struct dhcp6_list iana_list; /* list of IA_NA */
struct dhcp6_list reqopt_list; /* options in option request */
struct dhcp6_list stcode_list; /* status code */
struct dhcp6_list sip_list; /* SIP server list */
struct dhcp6_list sipname_list; /* SIP domain list */
struct dhcp6_list dns_list; /* DNS server list */
struct dhcp6_list dnsname_list; /* Domain Search list */
struct dhcp6_list ntp_list; /* NTP server list */
struct dhcp6_list prefix_list; /* prefix list */
struct dhcp6_list nis_list; /* NIS server list */
struct dhcp6_list nisname_list; /* NIS domain list */
struct dhcp6_list nisp_list; /* NIS+ server list */
struct dhcp6_list nispname_list; /* NIS+ domain list */
struct dhcp6_list bcmcs_list; /* BCMC server list */
struct dhcp6_list bcmcsname_list; /* BCMC domain list */
struct dhcp6_vbuf relay_msg; /* relay message */
#define relaymsg_len relay_msg.dv_len
#define relaymsg_msg relay_msg.dv_buf
struct dhcp6_vbuf ifidopt; /* Interface-id */
#define ifidopt_len ifidopt.dv_len
#define ifidopt_id ifidopt.dv_buf
u_int authflags;
#define DHCP6OPT_AUTHFLAG_NOINFO 0x1
int authproto;
int authalgorithm;
int authrdm;
/* the followings are effective only when NOINFO is unset */
u_int64_t authrd;
union {
struct {
u_int32_t keyid;
struct dhcp6_vbuf realm;
int offset; /* offset to the HMAC field */
} aiu_delayed;
struct {
int type;
int offset; /* offset to the HMAC field */
char val[16]; /* key value */
} aiu_reconfig;
} authinfo;
#define delayedauth_keyid authinfo.aiu_delayed.keyid
#define delayedauth_realmlen authinfo.aiu_delayed.realm.dv_len
#define delayedauth_realmval authinfo.aiu_delayed.realm.dv_buf
#define delayedauth_offset authinfo.aiu_delayed.offset
#define reconfigauth_type authinfo.aiu_reconfig.type
#define reconfigauth_offset authinfo.aiu_reconfig.offset
#define reconfigauth_val authinfo.aiu_reconfig.val
#ifdef TCSUPPORT_DSLITE
struct dhcp6_list dslitename_list; /*ds-lite name list */
struct dhcp6_list dsliteaddr_list; /*ds-lite address list */
#endif
};
/* DHCP6 base packet format */
struct dhcp6 {
union {
u_int8_t m;
u_int32_t x;
} dh6_msgtypexid;
/* options follow */
} __attribute__ ((__packed__));
#define dh6_msgtype dh6_msgtypexid.m
#define dh6_xid dh6_msgtypexid.x
#define DH6_XIDMASK 0x00ffffff
/* DHCPv6 relay messages */
struct dhcp6_relay {
u_int8_t dh6relay_msgtype;
u_int8_t dh6relay_hcnt;
struct in6_addr dh6relay_linkaddr; /* XXX: badly aligned */
struct in6_addr dh6relay_peeraddr; /* ditto */
/* options follow */
} __attribute__ ((__packed__));
/* options */
#define DH6OPT_CLIENTID 1
#define DH6OPT_SERVERID 2
#define DH6OPT_IA_NA 3
#define DH6OPT_IA_TA 4
#define DH6OPT_IAADDR 5
#define DH6OPT_ORO 6
#define DH6OPT_PREFERENCE 7
# define DH6OPT_PREF_UNDEF -1
# define DH6OPT_PREF_MAX 255
#define DH6OPT_ELAPSED_TIME 8
# define DH6OPT_ELAPSED_TIME_UNDEF -1
#define DH6OPT_RELAY_MSG 9
/* #define DH6OPT_SERVER_MSG 10: deprecated */
#define DH6OPT_AUTH 11
# define DH6OPT_AUTH_PROTO_DELAYED 2
# define DH6OPT_AUTH_RRECONFIGURE 3
# define DH6OPT_AUTH_ALG_HMACMD5 1
#define DH6OPT_UNICAST 12
#define DH6OPT_STATUS_CODE 13
# define DH6OPT_STCODE_SUCCESS 0
# define DH6OPT_STCODE_UNSPECFAIL 1
# define DH6OPT_STCODE_NOADDRSAVAIL 2
# define DH6OPT_STCODE_NOBINDING 3
# define DH6OPT_STCODE_NOTONLINK 4
# define DH6OPT_STCODE_USEMULTICAST 5
# define DH6OPT_STCODE_NOPREFIXAVAIL 6
#define DH6OPT_RAPID_COMMIT 14
#define DH6OPT_USER_CLASS 15
#define DH6OPT_VENDOR_CLASS 16
#define DH6OPT_VENDOR_OPTS 17
#define DH6OPT_INTERFACE_ID 18
#define DH6OPT_RECONF_MSG 19
#define DH6OPT_SIP_SERVER_D 21
#define DH6OPT_SIP_SERVER_A 22
#define DH6OPT_DNS 23
#define DH6OPT_DNSNAME 24
#define DH6OPT_IA_PD 25
#define DH6OPT_IA_PD_PREFIX 26
#define DH6OPT_NIS_SERVERS 27
#define DH6OPT_NISP_SERVERS 28
#define DH6OPT_NIS_DOMAIN_NAME 29
#define DH6OPT_NISP_DOMAIN_NAME 30
#define DH6OPT_NTP 31
#define DH6OPT_REFRESHTIME 32
#define DH6OPT_REFRESHTIME_UNDEF -1
#define DH6OPT_BCMCS_SERVER_D 33
#define DH6OPT_BCMCS_SERVER_A 34
#define DH6OPT_GEOCONF_CIVIC 36
#define DH6OPT_REMOTE_ID 37
#define DH6OPT_SUBSCRIBER_ID 38
#define DH6OPT_CLIENT_FQDN 39
#ifdef TCSUPPORT_DSLITE
//draft-ietf-softwire-ds-lite-tunnel-option
#define DH6OPT_DS_LITE_ADDR 252
#define DH6OPT_DS_LITE_NAME 253
#endif
/* The followings are KAME specific. */
struct dhcp6opt {
u_int16_t dh6opt_type;
u_int16_t dh6opt_len;
/* type-dependent data follows */
} __attribute__ ((__packed__));
/* DUID type 1 */
struct dhcp6opt_duid_type1 {
u_int16_t dh6_duid1_type;
u_int16_t dh6_duid1_hwtype;
u_int32_t dh6_duid1_time;
/* link-layer address follows */
} __attribute__ ((__packed__));
/* Add by HYY: DUID type 3, 27Sep13 */
struct dhcp6opt_duid_type3 {
u_int16_t dh6_duid3_type;
u_int16_t dh6_duid3_hwtype;
/* link-layer address follows */
} __attribute__ ((__packed__));
/* End Add */
/* Status Code */
struct dhcp6opt_stcode {
u_int16_t dh6_stcode_type;
u_int16_t dh6_stcode_len;
u_int16_t dh6_stcode_code;
} __attribute__ ((__packed__));
/*
* General format of Identity Association.
* This format applies to Prefix Delegation (IA_PD) and Non-temporary Addresses
* (IA_NA)
*/
struct dhcp6opt_ia {
u_int16_t dh6_ia_type;
u_int16_t dh6_ia_len;
u_int32_t dh6_ia_iaid;
u_int32_t dh6_ia_t1;
u_int32_t dh6_ia_t2;
/* sub options follow */
} __attribute__ ((__packed__));
/* IA Addr */
struct dhcp6opt_ia_addr {
u_int16_t dh6_ia_addr_type;
u_int16_t dh6_ia_addr_len;
struct in6_addr dh6_ia_addr_addr;
u_int32_t dh6_ia_addr_preferred_time;
u_int32_t dh6_ia_addr_valid_time;
} __attribute__ ((__packed__));
/* IA_PD Prefix */
struct dhcp6opt_ia_pd_prefix {
u_int16_t dh6_iapd_prefix_type;
u_int16_t dh6_iapd_prefix_len;
u_int32_t dh6_iapd_prefix_preferred_time;
u_int32_t dh6_iapd_prefix_valid_time;
u_int8_t dh6_iapd_prefix_prefix_len;
struct in6_addr dh6_iapd_prefix_prefix_addr;
} __attribute__ ((__packed__));
/* Authentication */
struct dhcp6opt_auth {
u_int16_t dh6_auth_type;
u_int16_t dh6_auth_len;
u_int8_t dh6_auth_proto;
u_int8_t dh6_auth_alg;
u_int8_t dh6_auth_rdm;
u_int8_t dh6_auth_rdinfo[8];
/* authentication information follows */
} __attribute__ ((__packed__));
enum { DHCP6_AUTHPROTO_UNDEF = -1, DHCP6_AUTHPROTO_DELAYED = 2,
DHCP6_AUTHPROTO_RECONFIG = 3 };
enum { DHCP6_AUTHALG_UNDEF = -1, DHCP6_AUTHALG_HMACMD5 = 1 };
enum { DHCP6_AUTHRDM_UNDEF = -1, DHCP6_AUTHRDM_MONOCOUNTER = 0 };
#endif /*__DHCP6_H_DEFINED*/