]> git.saurik.com Git - apple/xnu.git/blob - bsd/netinet/dhcp_options.h
xnu-1699.22.81.tar.gz
[apple/xnu.git] / bsd / netinet / dhcp_options.h
1
2 #ifndef _NETINET_DHCP_OPTIONS_H
3 #define _NETINET_DHCP_OPTIONS_H
4 #include <sys/appleapiopts.h>
5 /*
6 * Copyright (c) 1999-2007 Apple Inc. All rights reserved.
7 *
8 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
9 *
10 * This file contains Original Code and/or Modifications of Original Code
11 * as defined in and that are subject to the Apple Public Source License
12 * Version 2.0 (the 'License'). You may not use this file except in
13 * compliance with the License. The rights granted to you under the License
14 * may not be used to create, or enable the creation or redistribution of,
15 * unlawful or unlicensed copies of an Apple operating system, or to
16 * circumvent, violate, or enable the circumvention or violation of, any
17 * terms of an Apple operating system software license agreement.
18 *
19 * Please obtain a copy of the License at
20 * http://www.opensource.apple.com/apsl/ and read it before using this file.
21 *
22 * The Original Code and all software distributed under the License are
23 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
24 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
25 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
26 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
27 * Please see the License for the specific language governing rights and
28 * limitations under the License.
29 *
30 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
31 */
32
33 /*
34 * dhcp_options.h
35 * - routines to parse and access dhcp options
36 */
37
38 /*
39 * Modification History
40 *
41 * March 15, 2002 Dieter Siegmund (dieter@apple)
42 * - imported from bootp project
43 */
44 #include <mach/boolean.h>
45 #include <netinet/dhcp.h>
46
47
48 /* overloaded option values */
49 #define DHCP_OVERLOAD_FILE 1
50 #define DHCP_OVERLOAD_SNAME 2
51 #define DHCP_OVERLOAD_BOTH 3
52
53 /*
54 * DHCP_OPTION_SIZE_MAX
55 * - the largest size that an option can be (limited to an 8-bit quantity)
56 */
57 #define DHCP_OPTION_SIZE_MAX 255
58
59 #define DHCP_TAG_OFFSET 0
60 #define DHCP_LEN_OFFSET 1
61 #define DHCP_OPTION_OFFSET 2
62
63
64
65 #define RFC_OPTIONS_MAGIC { 99, 130, 83, 99 }
66 #define RFC_MAGIC_SIZE 4 /* bytes */
67
68 enum {
69 /* rfc 1497 vendor extensions: 0..18, 255 */
70 dhcptag_pad_e = 0,
71 dhcptag_end_e = 255,
72 dhcptag_subnet_mask_e = 1,
73 dhcptag_time_offset_e = 2,
74 dhcptag_router_e = 3,
75 dhcptag_time_server_e = 4,
76 dhcptag_name_server_e = 5,
77 dhcptag_domain_name_server_e = 6,
78 dhcptag_log_server_e = 7,
79 dhcptag_cookie_server_e = 8,
80 dhcptag_lpr_server_e = 9,
81 dhcptag_impress_server_e = 10,
82 dhcptag_resource_location_server_e = 11,
83 dhcptag_host_name_e = 12,
84 dhcptag_boot_file_size_e = 13,
85 dhcptag_merit_dump_file_e = 14,
86 dhcptag_domain_name_e = 15,
87 dhcptag_swap_server_e = 16,
88 dhcptag_root_path_e = 17,
89 dhcptag_extensions_path_e = 18,
90
91 /* ip layer parameters per host: 19..25 */
92 dhcptag_ip_forwarding_e = 19,
93 dhcptag_non_local_source_routing_e = 20,
94 dhcptag_policy_filter_e = 21,
95 dhcptag_max_dgram_reassembly_size_e = 22,
96 dhcptag_default_ip_time_to_live_e = 23,
97 dhcptag_path_mtu_aging_timeout_e = 24,
98 dhcptag_path_mtu_plateau_table_e = 25,
99
100 /* ip layer parameters per interface: 26..33 */
101 dhcptag_interface_mtu_e = 26,
102 dhcptag_all_subnets_local_e = 27,
103 dhcptag_broadcast_address_e = 28,
104 dhcptag_perform_mask_discovery_e = 29,
105 dhcptag_mask_supplier_e = 30,
106 dhcptag_perform_router_discovery_e = 31,
107 dhcptag_router_solicitation_address_e = 32,
108 dhcptag_static_route_e = 33,
109 dhcptag_trailer_encapsulation_e = 34,
110 dhcptag_arp_cache_timeout_e = 35,
111 dhcptag_ethernet_encapsulation_e = 36,
112
113 /* tcp parameters: 37..39 */
114 dhcptag_default_ttl_e = 37,
115 dhcptag_keepalive_interval_e = 38,
116 dhcptag_keepalive_garbage_e = 39,
117
118 /* application & service parameters: 40..49, 64, 65, 68..76, 78, 79, 95 */
119 dhcptag_nis_domain_e = 40,
120 dhcptag_nis_servers_e = 41,
121 dhcptag_network_time_protocol_servers_e = 42,
122 dhcptag_vendor_specific_e = 43,
123 dhcptag_nb_over_tcpip_name_server_e = 44,
124 dhcptag_nb_over_tcpip_dgram_dist_server_e = 45,
125 dhcptag_nb_over_tcpip_node_type_e = 46,
126 dhcptag_nb_over_tcpip_scope_e = 47,
127 dhcptag_x_windows_font_server_e = 48,
128 dhcptag_x_windows_display_manager_e = 49,
129 dhcptag_nis_plus_domain_e = 64,
130 dhcptag_nis_plus_servers_e = 65,
131 dhcptag_mobile_ip_home_agent_e = 68,
132 dhcptag_smtp_server_e = 69,
133 dhcptag_pop3_server_e = 70,
134 dhcptag_nntp_server_e = 71,
135 dhcptag_default_www_server_e = 72,
136 dhcptag_default_finger_server_e = 73,
137 dhcptag_default_irc_server_e = 74,
138 dhcptag_streettalk_server_e = 75,
139 dhcptag_stda_server_e = 76,
140 dhcptag_slp_directory_agent_e = 78,
141 dhcptag_slp_service_scope_e = 79,
142 dhcptag_ldap_url_e = 95,
143
144 /* dhcp-specific extensions: 50..61, 66, 67 */
145 dhcptag_requested_ip_address_e = 50,
146 dhcptag_lease_time_e = 51,
147 dhcptag_option_overload_e = 52,
148 dhcptag_dhcp_message_type_e = 53,
149 dhcptag_server_identifier_e = 54,
150 dhcptag_parameter_request_list_e = 55,
151 dhcptag_message_e = 56,
152 dhcptag_max_dhcp_message_size_e = 57,
153 dhcptag_renewal_t1_time_value_e = 58,
154 dhcptag_rebinding_t2_time_value_e = 59,
155 dhcptag_vendor_class_identifier_e = 60,
156 dhcptag_client_identifier_e = 61,
157 dhcptag_tftp_server_name_e = 66,
158 dhcptag_bootfile_name_e = 67,
159
160 /* netinfo parent tags: 112, 113 */
161 dhcptag_netinfo_server_address_e = 112,
162 dhcptag_netinfo_server_tag_e = 113,
163
164 /* ad-hoc network disable option */
165 dhcptag_auto_configure_e = 116,
166 };
167 typedef uint8_t dhcptag_t;
168
169 /*
170 * Module: dhcpol (dhcp options list)
171 *
172 * Purpose:
173 * Routines to parse and retrieve dhcp options.
174 */
175
176 typedef struct {
177 const void * * array; /* malloc'd array of pointers */
178 int size; /* number of elements in array */
179 int count; /* number of occupied elements */
180 } ptrlist_t;
181
182 typedef ptrlist_t dhcpol_t;
183
184 #ifdef KERNEL_PRIVATE
185
186 void dhcpol_init(dhcpol_t * list);
187 void dhcpol_free(dhcpol_t * list);
188 int dhcpol_count(dhcpol_t * list);
189 boolean_t dhcpol_add(dhcpol_t * list, const void * element);
190 const void * dhcpol_element(dhcpol_t * list, int i);
191 boolean_t dhcpol_concat(dhcpol_t * list, dhcpol_t * extra);
192 boolean_t dhcpol_parse_buffer(dhcpol_t * list,
193 const void * buffer,
194 int length);
195 const void * dhcpol_find(dhcpol_t * list, int tag, int * len_p,
196 int * start);
197 #if 0
198 void * dhcpol_get(dhcpol_t * list, int tag, int * len_p);
199 #endif
200 boolean_t dhcpol_parse_packet(dhcpol_t * options,
201 const struct dhcp * pkt, int len);
202 void dhcpol_print(dhcpol_t * list);
203 /*
204 * Module: dhcpoa (dhcp options area)
205 *
206 * Purpose:
207 * Types and functions to create new dhcp option areas.
208 */
209
210 /*
211 * Struct: dhcpoa_s
212 * Purpose:
213 * To record information about a dhcp option data area.
214 */
215 struct dhcpoa_s {
216 uint8_t * oa_buffer; /* data area to hold options */
217 int oa_size; /* size of buffer */
218 int oa_offset; /* offset of next option to write */
219 int oa_end_tag; /* to mark when options are terminated */
220 int oa_option_count;/* number of options present */
221 int oa_reserve; /* space to reserve, either 0 or 1 */
222 };
223
224 /*
225 * Type: dhcpoa_t
226 *
227 * Purpose:
228 * To record information about a dhcp option data area.
229 */
230 typedef struct dhcpoa_s dhcpoa_t;
231
232 /*
233 * Type:dhcpoa_ret_t
234 *
235 * Purpose:
236 * outine return codes
237 */
238 typedef enum {
239 dhcpoa_success_e = 0,
240 dhcpoa_failed_e,
241 dhcpoa_full_e,
242 } dhcpoa_ret_t;
243
244 void
245 dhcpoa_init(dhcpoa_t * opt, void * buffer, int size);
246
247 void
248 dhcpoa_init_no_end(dhcpoa_t * opt, void * buffer, int size);
249
250 dhcpoa_ret_t
251 dhcpoa_add(dhcpoa_t * oa_p, dhcptag_t tag, int len, const void * data);
252
253 dhcpoa_ret_t
254 dhcpoa_add_dhcpmsg(dhcpoa_t * oa_p, dhcp_msgtype_t msgtype);
255
256 #if 0
257 dhcpoa_ret_t
258 dhcpoa_vendor_add(dhcpoa_t * oa_p, dhcpoa_t * vendor_oa_p,
259 dhcptag_t tag, int len, void * option);
260 #endif
261
262 int
263 dhcpoa_used(dhcpoa_t * oa_p);
264
265 int
266 dhcpoa_count(dhcpoa_t * oa_p);
267
268 void *
269 dhcpoa_buffer(dhcpoa_t * oa_p);
270
271 int
272 dhcpoa_freespace(dhcpoa_t * oa_p);
273
274 int
275 dhcpoa_size(dhcpoa_t * oa_p);
276
277 #endif /* KERNEL_PRIVATE */
278 #endif /* _NETINET_DHCP_OPTIONS_H */