summaryrefslogtreecommitdiff
path: root/dhcpv6.h
blob: ebfa93a505bd857542771694f9d70f008490b4b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* these structures are word aligned */
#pragma pack(push)
#pragma pack(2) 
struct vlan_tag {
        u_int16_t v_tpid;
	u_int16_t v_tci;
};

struct dhcpv6_msg {	/* [RFC3315] ch 6 */
	u_int8_t msg_type;	/* Message type */
	u_int8_t xid[3];	/* transaction-id */
	char options[];		/* options */
};


struct dhcpv6_relay_msg {	/* [RFC3315] ch 7 */
	u_int8_t msg_type;	/* Message type */
	u_int8_t hop_count;	/* hop count */
	struct in6_addr link_addr;	/* link address */
	struct in6_addr peer_addr;	/* peer address */
	char options[];		/* options */
};

struct dhcpv6_option {	/* [RFC3315] generic option */
	u_int16_t code;	/* option-code */
	u_int16_t len;	/* option-len */
	char data[];	/* any */
};

#pragma pack(pop)

static struct dhcpv6_option *nextopt(const struct dhcpv6_option *opt) {
	return (struct dhcpv6_option *)((char *)opt + sizeof(struct dhcpv6_option) + ntohs(opt->len));
}


#define NEXTOPT(x) \
	x = ((struct dhcpv6_option *)x)->len ? \
		(struct dhcpv6_option *)((char *)x + (ntohs(((struct dhcpv6_option *)x)->len) + sizeof(struct dhcpv6_option))) : \
		NULL

/* all the following are ref http://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml */

/* message types */
/* 0	Reserved */	
#define DHCPV6_SOLICIT		1	/* [RFC3315] */
#define DHCPV6_ADVERTISE	2	/* [RFC3315] */
#define DHCPV6_REQUEST		3	/* [RFC3315] */
#define DHCPV6_CONFIRM		4	/* [RFC3315] */
#define DHCPV6_RENEW		5	/* [RFC3315] */
#define DHCPV6_REBIND		6	/* [RFC3315] */
#define DHCPV6_REPLY		7	/* [RFC3315] */
#define DHCPV6_RELEASE		8	/* [RFC3315] */
#define DHCPV6_DECLINE		9	/* [RFC3315] */
#define DHCPV6_RECONFIGURE	10	/* [RFC3315] */
#define DHCPV6_INFORMATION_REQ	11	/* [RFC3315] */
#define DHCPV6_RELAY_FORW	12	/* [RFC3315] */
#define DHCPV6_RELAY_REPL	13	/* [RFC3315] */
#define DHCPV6_LEASEQUERY	14	/* [RFC5007] */
#define DHCPV6_LEASEQUERY_REPLY	15	/* [RFC5007] */
#define DHCPV6_LEASEQUERY_DONE	16	/* [RFC5460] */
#define DHCPV6_LEASEQUERY_DATA	17	/* [RFC5460] */
/* 18-255	Unassigned */

/* option codes */
/* 0	Reserved	 */
#define OPTION_CLIENTID			1	/* [RFC3315] */
#define OPTION_SERVERID	       		2	/* [RFC3315] */
#define OPTION_IA_NA			3	/* [RFC3315] */
#define OPTION_IA_TA			4	/* [RFC3315] */
#define OPTION_IAADDR			5	/* [RFC3315] */
#define OPTION_ORO			6	/* [RFC3315] */
#define OPTION_PREFERENCE		7	/* [RFC3315] */
#define OPTION_ELAPSED_TIME		8	/* [RFC3315] */
#define OPTION_RELAY_MSG		9	/* [RFC3315] */
/* 10	Unassigned	 */
#define OPTION_AUTH			11	/* [RFC3315] */
#define OPTION_UNICAST			12	/* [RFC3315] */
#define OPTION_STATUS_CODE		13	/* [RFC3315] */
#define OPTION_RAPID_COMMIT		14	/* [RFC3315] */
#define OPTION_USER_CLASS		15	/* [RFC3315] */
#define OPTION_VENDOR_CLASS		16	/* [RFC3315] */
#define OPTION_VENDOR_OPTS		17	/* [RFC3315] */
#define OPTION_INTERFACE_ID		18	/* [RFC3315] */
#define OPTION_RECONF_MSG		19	/* [RFC3315] */
#define OPTION_RECONF_ACCEPT		20	/* [RFC3315] */
/* 21	SIP Servers Domain Name List	[RFC3319] */
/* 22	SIP Servers IPv6 Address List	[RFC3319] */
/* 23	DNS Recursive Name Server Option	[RFC3646] */
/* 24	Domain Search List option	[RFC3646] */
#define OPTION_IA_PD			25	/* [RFC3633] */
#define OPTION_IAPREFIX			26	/* [RFC3633] */
#define OPTION_NIS_SERVERS		27	/* [RFC3898] */
#define OPTION_NISP_SERVERS		28	/* [RFC3898] */
#define OPTION_NIS_DOMAIN_NAME		29	/* [RFC3898] */
#define OPTION_NISP_DOMAIN_NAME		30	/* [RFC3898] */
#define OPTION_SNTP_SERVERS		31	/* [RFC4075] */
#define OPTION_INFORMATION_REFRESH_TIME	32	/* [RFC4242] */
#define OPTION_BCMCS_SERVER_D		33	/* [RFC4280] */
#define OPTION_BCMCS_SERVER_A		34	/* [RFC4280] */
/* 35	Unassigned	 */
#define OPTION_GEOCONF_CIVIC		36	/* [RFC4776] */
#define OPTION_REMOTE_ID		37	/* [RFC4649] */
#define OPTION_SUBSCRIBER_ID		38	/* [RFC4580] */
#define OPTION_CLIENT_FQDN		39	/* [RFC4704] */
#define OPTION_PANA_AGENT		40	/* [RFC5192] */
#define OPTION_NEW_POSIX_TIMEZONE      	41	/* [RFC4833] */
#define OPTION_NEW_TZDB_TIMEZONE       	42	/* [RFC4833] */
#define OPTION_ERO			43	/* [RFC4994] */
#define OPTION_LQ_QUERY			44	/* [RFC5007] */
#define OPTION_CLIENT_DATA		45	/* [RFC5007] */
#define OPTION_CLT_TIME			46	/* [RFC5007] */
#define OPTION_LQ_RELAY_DATA		47	/* [RFC5007] */
#define OPTION_LQ_CLIENT_LINK		48	/* [RFC5007] */
#define OPTION_MIP6_HNINF		49	/* [RFC-ietf-mip6-hiopt-17] */
#define OPTION_MIP6_RELAY		50	/* [RFC-ietf-mip6-hiopt-17] */
#define OPTION_V6_LOST			51	/* [RFC5223] */
#define OPTION_CAPWAP_AC_V6		52	/* [RFC5417] */
#define OPTION_RELAY_ID			53	/* [RFC5460] */
#define OPTION_IPv6_Address_MoS		54	/* [RFC5678] */
#define OPTION_IPv6_FQDN_MoS		55	/* [RFC5678] */
#define OPTION_NTP_SERVER		56	/* [RFC5908] */
#define OPTION_V6_ACCESS_DOMAIN		57	/* [RFC5986] */
#define OPTION_SIP_UA_CS_LIST		58	/* [RFC6011] */
#define OPT_BOOTFILE_URL		59	/* [RFC5970] */
#define OPT_BOOTFILE_PARAM		60	/* [RFC5970] */
#define OPTION_CLIENT_ARCH_TYPE		61	/* [RFC5970] */
#define OPTION_NII			62	/* [RFC5970] */
#define OPTION_GEOLOCATION		63	/* [RFC6225] */
#define OPTION_AFTR_NAME		64	/* [RFC6334] */
#define OPTION_ERP_LOCAL_DOMAIN_NAME   	65	/* [RFC-ietf-hokey-ldn-discovery-10] */
#define OPTION_RSOO			66	/* [RFC-ietf-dhc-dhcpv6-relay-supplied-options-09] */
/* 67-255	Unassigned */

/* Status Codes */
#define Success			0	/* [RFC3315] */
#define UnspecFail		1	/* [RFC3315] */
#define NoAddrsAvail		2	/* [RFC3315] */
#define NoBinding		3	/* [RFC3315] */
#define NotOnLink		4	/* [RFC3315] */
#define UseMulticast		5	/* [RFC3315] */
#define NoPrefixAvail		6	/* [RFC3633] */
#define UnknownQueryType		7	/* [RFC5007] */
#define MalformedQuery		8	/* [RFC5007] */
#define NotConfigured		9	/* [RFC5007] */
#define NotAllowed		10	/* [RFC5007] */
#define QueryTerminated		11	/* [RFC5460] */
/* 12-255	Unassigned */


/* DUID types */
#define DUID_LLT       	1	/* [RFC3315] */
#define DUID_EN		2	/* [RFC3315] */
#define DUID_LL		3	/* [RFC3315] */
#define DUID_UUID      	4	/* [RFC6355] */