summaryrefslogtreecommitdiffstats
path: root/qemu/roms/ipxe/src/include/ipxe/dhcpv6.h
blob: 9307b6cae4c38e125a21e7e60b6384d2d296826e (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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
#ifndef _IPXE_DHCPV6_H
#define _IPXE_DHCPV6_H

/** @file
 *
 * Dynamic Host Configuration Protocol for IPv6
 *
 */

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );

#include <stdint.h>
#include <ipxe/in.h>
#include <ipxe/uuid.h>

/** DHCPv6 server port */
#define DHCPV6_SERVER_PORT 547

/** DHCPv6 client port */
#define DHCPV6_CLIENT_PORT 546

/**
 * A DHCPv6 option
 *
 */
struct dhcpv6_option {
	/** Code */
	uint16_t code;
	/** Length of the data field */
	uint16_t len;
	/** Data */
	uint8_t data[0];
} __attribute__ (( packed ));

/** DHCP unique identifier based on UUID (DUID-UUID) */
struct dhcpv6_duid_uuid {
	/** Type */
	uint16_t type;
	/** UUID */
	union uuid uuid;
} __attribute__ (( packed ));

/** DHCP unique identifier based on UUID (DUID-UUID) */
#define DHCPV6_DUID_UUID 4

/** DHCPv6 client or server identifier option */
struct dhcpv6_duid_option {
	/** Option header */
	struct dhcpv6_option header;
	/** DHCP unique identifier (DUID) */
	uint8_t duid[0];
} __attribute__ (( packed ));

/** DHCPv6 client identifier option */
#define DHCPV6_CLIENT_ID 1

/** DHCPv6 server identifier option */
#define DHCPV6_SERVER_ID 2

/** DHCPv6 identity association for non-temporary address (IA_NA) option */
struct dhcpv6_ia_na_option {
	/** Option header */
	struct dhcpv6_option header;
	/** Identity association identifier (IAID) */
	uint32_t iaid;
	/** Renew time (in seconds) */
	uint32_t renew;
	/** Rebind time (in seconds) */
	uint32_t rebind;
	/** IA_NA options */
	struct dhcpv6_option options[0];
} __attribute__ (( packed ));

/** DHCPv6 identity association for non-temporary address (IA_NA) option */
#define DHCPV6_IA_NA 3

/** DHCPv6 identity association address (IAADDR) option */
struct dhcpv6_iaaddr_option {
	/** Option header */
	struct dhcpv6_option header;
	/** IPv6 address */
	struct in6_addr address;
	/** Preferred lifetime (in seconds) */
	uint32_t preferred;
	/** Valid lifetime (in seconds) */
	uint32_t valid;
	/** IAADDR options */
	struct dhcpv6_option options[0];
} __attribute__ (( packed ));

/** DHCPv6 identity association address (IAADDR) option */
#define DHCPV6_IAADDR 5

/** DHCPv6 option request option */
struct dhcpv6_option_request_option {
	/** Option header */
	struct dhcpv6_option header;
	/** Requested options */
	uint16_t requested[0];
} __attribute__ (( packed ));

/** DHCPv6 option request option */
#define DHCPV6_OPTION_REQUEST 6

/** DHCPv6 elapsed time option */
struct dhcpv6_elapsed_time_option {
	/** Option header */
	struct dhcpv6_option header;
	/** Elapsed time, in centiseconds */
	uint16_t elapsed;
} __attribute__ (( packed ));

/** DHCPv6 elapsed time option */
#define DHCPV6_ELAPSED_TIME 8

/** DHCPv6 status code option */
struct dhcpv6_status_code_option {
	/** Option header */
	struct dhcpv6_option header;
	/** Status code */
	uint16_t status;
	/** Status message */
	char message[0];
} __attribute__ (( packed ));

/** DHCPv6 status code option */
#define DHCPV6_STATUS_CODE 13

/** DHCPv6 user class */
struct dhcpv6_user_class {
	/** Length */
	uint16_t len;
	/** User class string */
	char string[0];
} __attribute__ (( packed ));

/** DHCPv6 user class option */
struct dhcpv6_user_class_option {
	/** Option header */
	struct dhcpv6_option header;
	/** User class */
	struct dhcpv6_user_class user_class[0];
} __attribute__ (( packed ));

/** DHCPv6 user class option */
#define DHCPV6_USER_CLASS 15

/** DHCPv6 DNS recursive name server option */
#define DHCPV6_DNS_SERVERS 23

/** DHCPv6 domain search list option */
#define DHCPV6_DOMAIN_LIST 24

/** DHCPv6 bootfile URI option */
#define DHCPV6_BOOTFILE_URL 59

/** DHCPv6 bootfile parameters option */
#define DHCPV6_BOOTFILE_PARAM 60

/** DHCPv6 syslog server option
 *
 * This option code has not yet been assigned by IANA.  Please update
 * this definition once an option code has been assigned.
 */
#define DHCPV6_LOG_SERVERS 0xffffffffUL

/**
 * Any DHCPv6 option
 *
 */
union dhcpv6_any_option {
	struct dhcpv6_option header;
	struct dhcpv6_duid_option duid;
	struct dhcpv6_ia_na_option ia_na;
	struct dhcpv6_iaaddr_option iaaddr;
	struct dhcpv6_option_request_option option_request;
	struct dhcpv6_elapsed_time_option elapsed_time;
	struct dhcpv6_status_code_option status_code;
	struct dhcpv6_user_class_option user_class;
};

/**
 * A DHCPv6 header
 *
 */
struct dhcpv6_header {
	/** Message type */
	uint8_t type;
	/** Transaction ID */
	uint8_t xid[3];
	/** Options */
	struct dhcpv6_option options[0];
} __attribute__ (( packed ));

/** DHCPv6 solicitation */
#define DHCPV6_SOLICIT 1

/** DHCPv6 advertisement */
#define DHCPV6_ADVERTISE 2

/** DHCPv6 request */
#define DHCPV6_REQUEST 3

/** DHCPv6 reply */
#define DHCPV6_REPLY 7

/** DHCPv6 information request */
#define DHCPV6_INFORMATION_REQUEST 11

/** DHCPv6 settings block name */
#define DHCPV6_SETTINGS_NAME "dhcpv6"

/**
 * Construct all-DHCP-relay-agents-and-servers multicast address
 *
 * @v addr		Zeroed address to construct
 */
static inline void ipv6_all_dhcp_relay_and_servers ( struct in6_addr *addr ) {
	addr->s6_addr16[0] = htons ( 0xff02 );
	addr->s6_addr[13] = 1;
	addr->s6_addr[15] = 2;
}

extern int start_dhcpv6 ( struct interface *job, struct net_device *netdev,
			  int stateful );

#endif /* _IPXE_DHCPV6_H */