1*83ee113eSDavid van Moolenbroek /* $NetBSD: tables.c,v 1.1.1.3 2014/07/12 11:57:47 spz Exp $ */
2*83ee113eSDavid van Moolenbroek /* tables.c
3*83ee113eSDavid van Moolenbroek
4*83ee113eSDavid van Moolenbroek Tables of information... */
5*83ee113eSDavid van Moolenbroek
6*83ee113eSDavid van Moolenbroek /*
7*83ee113eSDavid van Moolenbroek * Copyright (c) 2011-2014 by Internet Systems Consortium, Inc. ("ISC")
8*83ee113eSDavid van Moolenbroek * Copyright (c) 2004-2009 by Internet Systems Consortium, Inc. ("ISC")
9*83ee113eSDavid van Moolenbroek * Copyright (c) 1995-2003 by Internet Software Consortium
10*83ee113eSDavid van Moolenbroek *
11*83ee113eSDavid van Moolenbroek * Permission to use, copy, modify, and distribute this software for any
12*83ee113eSDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
13*83ee113eSDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
14*83ee113eSDavid van Moolenbroek *
15*83ee113eSDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
16*83ee113eSDavid van Moolenbroek * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
17*83ee113eSDavid van Moolenbroek * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
18*83ee113eSDavid van Moolenbroek * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19*83ee113eSDavid van Moolenbroek * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20*83ee113eSDavid van Moolenbroek * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21*83ee113eSDavid van Moolenbroek * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22*83ee113eSDavid van Moolenbroek *
23*83ee113eSDavid van Moolenbroek * Internet Systems Consortium, Inc.
24*83ee113eSDavid van Moolenbroek * 950 Charter Street
25*83ee113eSDavid van Moolenbroek * Redwood City, CA 94063
26*83ee113eSDavid van Moolenbroek * <info@isc.org>
27*83ee113eSDavid van Moolenbroek * https://www.isc.org/
28*83ee113eSDavid van Moolenbroek *
29*83ee113eSDavid van Moolenbroek */
30*83ee113eSDavid van Moolenbroek
31*83ee113eSDavid van Moolenbroek #include <sys/cdefs.h>
32*83ee113eSDavid van Moolenbroek __RCSID("$NetBSD: tables.c,v 1.1.1.3 2014/07/12 11:57:47 spz Exp $");
33*83ee113eSDavid van Moolenbroek
34*83ee113eSDavid van Moolenbroek #include "dhcpd.h"
35*83ee113eSDavid van Moolenbroek
36*83ee113eSDavid van Moolenbroek /* XXXDPN: Moved here from hash.c, when it moved to libomapi. Not sure
37*83ee113eSDavid van Moolenbroek where these really belong. */
38*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS (group, const char *, struct group_object, group_hash_t,
39*83ee113eSDavid van Moolenbroek group_reference, group_dereference, do_string_hash)
40*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS (universe, const char *, struct universe, universe_hash_t, 0, 0,
41*83ee113eSDavid van Moolenbroek do_case_hash)
42*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS (option_name, const char *, struct option, option_name_hash_t,
43*83ee113eSDavid van Moolenbroek option_reference, option_dereference, do_case_hash)
44*83ee113eSDavid van Moolenbroek HASH_FUNCTIONS (option_code, const unsigned *, struct option,
45*83ee113eSDavid van Moolenbroek option_code_hash_t, option_reference, option_dereference,
46*83ee113eSDavid van Moolenbroek do_number_hash)
47*83ee113eSDavid van Moolenbroek
48*83ee113eSDavid van Moolenbroek /* DHCP Option names, formats and codes, from RFC1533.
49*83ee113eSDavid van Moolenbroek
50*83ee113eSDavid van Moolenbroek Format codes:
51*83ee113eSDavid van Moolenbroek
52*83ee113eSDavid van Moolenbroek I - IPv4 address
53*83ee113eSDavid van Moolenbroek 6 - IPv6 address
54*83ee113eSDavid van Moolenbroek l - 32-bit signed integer
55*83ee113eSDavid van Moolenbroek L - 32-bit unsigned integer
56*83ee113eSDavid van Moolenbroek s - 16-bit signed integer
57*83ee113eSDavid van Moolenbroek S - 16-bit unsigned integer
58*83ee113eSDavid van Moolenbroek b - 8-bit signed integer
59*83ee113eSDavid van Moolenbroek B - 8-bit unsigned integer
60*83ee113eSDavid van Moolenbroek t - ASCII text
61*83ee113eSDavid van Moolenbroek T - Lease Time, 32-bit unsigned integer implying a number of seconds from
62*83ee113eSDavid van Moolenbroek some event. The special all-ones value means 'infinite'. May either
63*83ee113eSDavid van Moolenbroek be printed as a decimal, eg, "3600", or as this name, eg, "infinite".
64*83ee113eSDavid van Moolenbroek f - flag (true or false)
65*83ee113eSDavid van Moolenbroek A - array of all that precedes (e.g., fIA means array of records of
66*83ee113eSDavid van Moolenbroek a flag and an IP address)
67*83ee113eSDavid van Moolenbroek a - array of the preceding character (e.g., fIa means a single flag
68*83ee113eSDavid van Moolenbroek followed by an array of IP addresses)
69*83ee113eSDavid van Moolenbroek U - name of an option space (universe)
70*83ee113eSDavid van Moolenbroek F - implicit flag - the presence of the option indicates that the
71*83ee113eSDavid van Moolenbroek flag is true.
72*83ee113eSDavid van Moolenbroek o - the preceding value is optional.
73*83ee113eSDavid van Moolenbroek E - encapsulation, string or colon-separated hex list (the latter
74*83ee113eSDavid van Moolenbroek two for parsing). E is followed by a text string containing
75*83ee113eSDavid van Moolenbroek the name of the option space to encapsulate, followed by a '.'.
76*83ee113eSDavid van Moolenbroek If the E is immediately followed by '.', the applicable vendor
77*83ee113eSDavid van Moolenbroek option space is used if one is defined.
78*83ee113eSDavid van Moolenbroek e - If an encapsulation directive is not the first thing in the string,
79*83ee113eSDavid van Moolenbroek the option scanner requires an efficient way to find the encapsulation.
80*83ee113eSDavid van Moolenbroek This is done by placing a 'e' at the beginning of the option. The
81*83ee113eSDavid van Moolenbroek 'e' has no other purpose, and is not required if 'E' is the first
82*83ee113eSDavid van Moolenbroek thing in the option.
83*83ee113eSDavid van Moolenbroek X - either an ASCII string or binary data. On output, the string is
84*83ee113eSDavid van Moolenbroek scanned to see if it's printable ASCII and, if so, output as a
85*83ee113eSDavid van Moolenbroek quoted string. If not, it's output as colon-separated hex. On
86*83ee113eSDavid van Moolenbroek input, the option can be specified either as a quoted string or as
87*83ee113eSDavid van Moolenbroek a colon-separated hex list.
88*83ee113eSDavid van Moolenbroek N - enumeration. N is followed by a text string containing
89*83ee113eSDavid van Moolenbroek the name of the set of enumeration values to parse or emit,
90*83ee113eSDavid van Moolenbroek followed by a '.'. The width of the data is specified in the
91*83ee113eSDavid van Moolenbroek named enumeration. Named enumerations are tracked in parse.c.
92*83ee113eSDavid van Moolenbroek d - Domain name (i.e., FOO or FOO.BAR).
93*83ee113eSDavid van Moolenbroek D - Domain list (i.e., example.com eng.example.com)
94*83ee113eSDavid van Moolenbroek c - When following a 'D' atom, enables compression pointers.
95*83ee113eSDavid van Moolenbroek Z - Zero-length option
96*83ee113eSDavid van Moolenbroek */
97*83ee113eSDavid van Moolenbroek
98*83ee113eSDavid van Moolenbroek struct universe dhcp_universe;
99*83ee113eSDavid van Moolenbroek static struct option dhcp_options[] = {
100*83ee113eSDavid van Moolenbroek { "subnet-mask", "I", &dhcp_universe, 1, 1 },
101*83ee113eSDavid van Moolenbroek { "time-offset", "l", &dhcp_universe, 2, 1 },
102*83ee113eSDavid van Moolenbroek { "routers", "IA", &dhcp_universe, 3, 1 },
103*83ee113eSDavid van Moolenbroek { "time-servers", "IA", &dhcp_universe, 4, 1 },
104*83ee113eSDavid van Moolenbroek { "ien116-name-servers", "IA", &dhcp_universe, 5, 1 },
105*83ee113eSDavid van Moolenbroek { "domain-name-servers", "IA", &dhcp_universe, 6, 1 },
106*83ee113eSDavid van Moolenbroek { "log-servers", "IA", &dhcp_universe, 7, 1 },
107*83ee113eSDavid van Moolenbroek { "cookie-servers", "IA", &dhcp_universe, 8, 1 },
108*83ee113eSDavid van Moolenbroek { "lpr-servers", "IA", &dhcp_universe, 9, 1 },
109*83ee113eSDavid van Moolenbroek { "impress-servers", "IA", &dhcp_universe, 10, 1 },
110*83ee113eSDavid van Moolenbroek { "resource-location-servers", "IA", &dhcp_universe, 11, 1 },
111*83ee113eSDavid van Moolenbroek { "host-name", "t", &dhcp_universe, 12, 1 },
112*83ee113eSDavid van Moolenbroek { "boot-size", "S", &dhcp_universe, 13, 1 },
113*83ee113eSDavid van Moolenbroek { "merit-dump", "t", &dhcp_universe, 14, 1 },
114*83ee113eSDavid van Moolenbroek { "domain-name", "t", &dhcp_universe, 15, 1 },
115*83ee113eSDavid van Moolenbroek { "swap-server", "I", &dhcp_universe, 16, 1 },
116*83ee113eSDavid van Moolenbroek { "root-path", "t", &dhcp_universe, 17, 1 },
117*83ee113eSDavid van Moolenbroek { "extensions-path", "t", &dhcp_universe, 18, 1 },
118*83ee113eSDavid van Moolenbroek { "ip-forwarding", "f", &dhcp_universe, 19, 1 },
119*83ee113eSDavid van Moolenbroek { "non-local-source-routing", "f", &dhcp_universe, 20, 1 },
120*83ee113eSDavid van Moolenbroek { "policy-filter", "IIA", &dhcp_universe, 21, 1 },
121*83ee113eSDavid van Moolenbroek { "max-dgram-reassembly", "S", &dhcp_universe, 22, 1 },
122*83ee113eSDavid van Moolenbroek { "default-ip-ttl", "B", &dhcp_universe, 23, 1 },
123*83ee113eSDavid van Moolenbroek { "path-mtu-aging-timeout", "L", &dhcp_universe, 24, 1 },
124*83ee113eSDavid van Moolenbroek { "path-mtu-plateau-table", "SA", &dhcp_universe, 25, 1 },
125*83ee113eSDavid van Moolenbroek { "interface-mtu", "S", &dhcp_universe, 26, 1 },
126*83ee113eSDavid van Moolenbroek { "all-subnets-local", "f", &dhcp_universe, 27, 1 },
127*83ee113eSDavid van Moolenbroek { "broadcast-address", "I", &dhcp_universe, 28, 1 },
128*83ee113eSDavid van Moolenbroek { "perform-mask-discovery", "f", &dhcp_universe, 29, 1 },
129*83ee113eSDavid van Moolenbroek { "mask-supplier", "f", &dhcp_universe, 30, 1 },
130*83ee113eSDavid van Moolenbroek { "router-discovery", "f", &dhcp_universe, 31, 1 },
131*83ee113eSDavid van Moolenbroek { "router-solicitation-address", "I", &dhcp_universe, 32, 1 },
132*83ee113eSDavid van Moolenbroek { "static-routes", "IIA", &dhcp_universe, 33, 1 },
133*83ee113eSDavid van Moolenbroek { "trailer-encapsulation", "f", &dhcp_universe, 34, 1 },
134*83ee113eSDavid van Moolenbroek { "arp-cache-timeout", "L", &dhcp_universe, 35, 1 },
135*83ee113eSDavid van Moolenbroek { "ieee802-3-encapsulation", "f", &dhcp_universe, 36, 1 },
136*83ee113eSDavid van Moolenbroek { "default-tcp-ttl", "B", &dhcp_universe, 37, 1 },
137*83ee113eSDavid van Moolenbroek { "tcp-keepalive-interval", "L", &dhcp_universe, 38, 1 },
138*83ee113eSDavid van Moolenbroek { "tcp-keepalive-garbage", "f", &dhcp_universe, 39, 1 },
139*83ee113eSDavid van Moolenbroek { "nis-domain", "t", &dhcp_universe, 40, 1 },
140*83ee113eSDavid van Moolenbroek { "nis-servers", "IA", &dhcp_universe, 41, 1 },
141*83ee113eSDavid van Moolenbroek { "ntp-servers", "IA", &dhcp_universe, 42, 1 },
142*83ee113eSDavid van Moolenbroek { "vendor-encapsulated-options", "E.", &dhcp_universe, 43, 1 },
143*83ee113eSDavid van Moolenbroek { "netbios-name-servers", "IA", &dhcp_universe, 44, 1 },
144*83ee113eSDavid van Moolenbroek { "netbios-dd-server", "IA", &dhcp_universe, 45, 1 },
145*83ee113eSDavid van Moolenbroek { "netbios-node-type", "B", &dhcp_universe, 46, 1 },
146*83ee113eSDavid van Moolenbroek { "netbios-scope", "t", &dhcp_universe, 47, 1 },
147*83ee113eSDavid van Moolenbroek { "font-servers", "IA", &dhcp_universe, 48, 1 },
148*83ee113eSDavid van Moolenbroek { "x-display-manager", "IA", &dhcp_universe, 49, 1 },
149*83ee113eSDavid van Moolenbroek { "dhcp-requested-address", "I", &dhcp_universe, 50, 1 },
150*83ee113eSDavid van Moolenbroek { "dhcp-lease-time", "L", &dhcp_universe, 51, 1 },
151*83ee113eSDavid van Moolenbroek { "dhcp-option-overload", "B", &dhcp_universe, 52, 1 },
152*83ee113eSDavid van Moolenbroek { "dhcp-message-type", "B", &dhcp_universe, 53, 1 },
153*83ee113eSDavid van Moolenbroek { "dhcp-server-identifier", "I", &dhcp_universe, 54, 1 },
154*83ee113eSDavid van Moolenbroek { "dhcp-parameter-request-list", "BA", &dhcp_universe, 55, 1 },
155*83ee113eSDavid van Moolenbroek { "dhcp-message", "t", &dhcp_universe, 56, 1 },
156*83ee113eSDavid van Moolenbroek { "dhcp-max-message-size", "S", &dhcp_universe, 57, 1 },
157*83ee113eSDavid van Moolenbroek { "dhcp-renewal-time", "L", &dhcp_universe, 58, 1 },
158*83ee113eSDavid van Moolenbroek { "dhcp-rebinding-time", "L", &dhcp_universe, 59, 1 },
159*83ee113eSDavid van Moolenbroek { "vendor-class-identifier", "X", &dhcp_universe, 60, 1 },
160*83ee113eSDavid van Moolenbroek { "dhcp-client-identifier", "X", &dhcp_universe, 61, 1 },
161*83ee113eSDavid van Moolenbroek { "nwip-domain", "t", &dhcp_universe, 62, 1 },
162*83ee113eSDavid van Moolenbroek { "nwip-suboptions", "Enwip.", &dhcp_universe, 63, 1 },
163*83ee113eSDavid van Moolenbroek { "nisplus-domain", "t", &dhcp_universe, 64, 1 },
164*83ee113eSDavid van Moolenbroek { "nisplus-servers", "IA", &dhcp_universe, 65, 1 },
165*83ee113eSDavid van Moolenbroek { "tftp-server-name", "t", &dhcp_universe, 66, 1 },
166*83ee113eSDavid van Moolenbroek { "bootfile-name", "t", &dhcp_universe, 67, 1 },
167*83ee113eSDavid van Moolenbroek { "mobile-ip-home-agent", "IA", &dhcp_universe, 68, 1 },
168*83ee113eSDavid van Moolenbroek { "smtp-server", "IA", &dhcp_universe, 69, 1 },
169*83ee113eSDavid van Moolenbroek { "pop-server", "IA", &dhcp_universe, 70, 1 },
170*83ee113eSDavid van Moolenbroek { "nntp-server", "IA", &dhcp_universe, 71, 1 },
171*83ee113eSDavid van Moolenbroek { "www-server", "IA", &dhcp_universe, 72, 1 },
172*83ee113eSDavid van Moolenbroek { "finger-server", "IA", &dhcp_universe, 73, 1 },
173*83ee113eSDavid van Moolenbroek { "irc-server", "IA", &dhcp_universe, 74, 1 },
174*83ee113eSDavid van Moolenbroek { "streettalk-server", "IA", &dhcp_universe, 75, 1 },
175*83ee113eSDavid van Moolenbroek { "streettalk-directory-assistance-server", "IA",
176*83ee113eSDavid van Moolenbroek &dhcp_universe, 76, 1 },
177*83ee113eSDavid van Moolenbroek { "user-class", "t", &dhcp_universe, 77, 1 },
178*83ee113eSDavid van Moolenbroek { "slp-directory-agent", "fIa", &dhcp_universe, 78, 1 },
179*83ee113eSDavid van Moolenbroek { "slp-service-scope", "fto", &dhcp_universe, 79, 1 },
180*83ee113eSDavid van Moolenbroek /* 80 is the zero-length rapid-commit (RFC 4039) */
181*83ee113eSDavid van Moolenbroek { "fqdn", "Efqdn.", &dhcp_universe, 81, 1 },
182*83ee113eSDavid van Moolenbroek { "relay-agent-information", "Eagent.", &dhcp_universe, 82, 1 },
183*83ee113eSDavid van Moolenbroek /* 83 is iSNS (RFC 4174) */
184*83ee113eSDavid van Moolenbroek /* 84 is unassigned */
185*83ee113eSDavid van Moolenbroek { "nds-servers", "IA", &dhcp_universe, 85, 1 },
186*83ee113eSDavid van Moolenbroek { "nds-tree-name", "t", &dhcp_universe, 86, 1 },
187*83ee113eSDavid van Moolenbroek { "nds-context", "t", &dhcp_universe, 87, 1 },
188*83ee113eSDavid van Moolenbroek
189*83ee113eSDavid van Moolenbroek /* Note: RFC4280 fails to identify if the DHCPv4 option is to use
190*83ee113eSDavid van Moolenbroek * compression pointers or not. Assume not.
191*83ee113eSDavid van Moolenbroek */
192*83ee113eSDavid van Moolenbroek { "bcms-controller-names", "D", &dhcp_universe, 88, 1 },
193*83ee113eSDavid van Moolenbroek { "bcms-controller-address", "Ia", &dhcp_universe, 89, 1 },
194*83ee113eSDavid van Moolenbroek
195*83ee113eSDavid van Moolenbroek /* 90 is the authentication option (RFC 3118) */
196*83ee113eSDavid van Moolenbroek
197*83ee113eSDavid van Moolenbroek { "client-last-transaction-time", "L", &dhcp_universe, 91, 1 },
198*83ee113eSDavid van Moolenbroek { "associated-ip", "Ia", &dhcp_universe, 92, 1 },
199*83ee113eSDavid van Moolenbroek #if 0
200*83ee113eSDavid van Moolenbroek /* Defined by RFC 4578 */
201*83ee113eSDavid van Moolenbroek { "pxe-system-type", "S", &dhcp_universe, 93, 1 },
202*83ee113eSDavid van Moolenbroek { "pxe-interface-id", "BBB", &dhcp_universe, 94, 1 },
203*83ee113eSDavid van Moolenbroek { "pxe-client-id", "BX", &dhcp_universe, 97, 1 },
204*83ee113eSDavid van Moolenbroek #endif
205*83ee113eSDavid van Moolenbroek { "uap-servers", "t", &dhcp_universe, 98, 1 },
206*83ee113eSDavid van Moolenbroek #if defined(RFC4776_OPTIONS)
207*83ee113eSDavid van Moolenbroek { "geoconf-civic", "X", &dhcp_universe, 99, 1 },
208*83ee113eSDavid van Moolenbroek #endif
209*83ee113eSDavid van Moolenbroek #if defined(RFC4833_OPTIONS)
210*83ee113eSDavid van Moolenbroek { "pcode", "t", &dhcp_universe, 100, 1 },
211*83ee113eSDavid van Moolenbroek { "tcode", "t", &dhcp_universe, 101, 1 },
212*83ee113eSDavid van Moolenbroek #endif
213*83ee113eSDavid van Moolenbroek { "netinfo-server-address", "Ia", &dhcp_universe, 112, 1 },
214*83ee113eSDavid van Moolenbroek { "netinfo-server-tag", "t", &dhcp_universe, 113, 1 },
215*83ee113eSDavid van Moolenbroek { "default-url", "t", &dhcp_universe, 114, 1 },
216*83ee113eSDavid van Moolenbroek #if defined(RFC2937_OPTIONS)
217*83ee113eSDavid van Moolenbroek { "name-service-search", "Sa", &dhcp_universe, 117, 1 },
218*83ee113eSDavid van Moolenbroek #endif
219*83ee113eSDavid van Moolenbroek { "subnet-selection", "I", &dhcp_universe, 118, 1 },
220*83ee113eSDavid van Moolenbroek { "domain-search", "Dc", &dhcp_universe, 119, 1 },
221*83ee113eSDavid van Moolenbroek { "vivco", "Evendor-class.", &dhcp_universe, 124, 1 },
222*83ee113eSDavid van Moolenbroek { "vivso", "Evendor.", &dhcp_universe, 125, 1 },
223*83ee113eSDavid van Moolenbroek #if 0
224*83ee113eSDavid van Moolenbroek /* Referenced by RFC 4578.
225*83ee113eSDavid van Moolenbroek * DO NOT UNCOMMENT THESE DEFINITIONS: these names are placeholders
226*83ee113eSDavid van Moolenbroek * and will not be used in future versions of the software.
227*83ee113eSDavid van Moolenbroek */
228*83ee113eSDavid van Moolenbroek { "pxe-undefined-1", "X", &dhcp_universe, 128, 1 },
229*83ee113eSDavid van Moolenbroek { "pxe-undefined-2", "X", &dhcp_universe, 129, 1 },
230*83ee113eSDavid van Moolenbroek { "pxe-undefined-3", "X", &dhcp_universe, 130, 1 },
231*83ee113eSDavid van Moolenbroek { "pxe-undefined-4", "X", &dhcp_universe, 131, 1 },
232*83ee113eSDavid van Moolenbroek { "pxe-undefined-5", "X", &dhcp_universe, 132, 1 },
233*83ee113eSDavid van Moolenbroek { "pxe-undefined-6", "X", &dhcp_universe, 133, 1 },
234*83ee113eSDavid van Moolenbroek { "pxe-undefined-7", "X", &dhcp_universe, 134, 1 },
235*83ee113eSDavid van Moolenbroek { "pxe-undefined-8", "X", &dhcp_universe, 135, 1 },
236*83ee113eSDavid van Moolenbroek #endif
237*83ee113eSDavid van Moolenbroek #if defined(RFC5192_OPTIONS)
238*83ee113eSDavid van Moolenbroek {"pana-agent", "Ia", &dhcp_universe, 136, 1 },
239*83ee113eSDavid van Moolenbroek #endif
240*83ee113eSDavid van Moolenbroek #if defined(RFC5223_OPTIONS)
241*83ee113eSDavid van Moolenbroek {"v4-lost", "d", &dhcp_universe, 137, 1 },
242*83ee113eSDavid van Moolenbroek #endif
243*83ee113eSDavid van Moolenbroek #if defined(RFC5417_OPTIONS)
244*83ee113eSDavid van Moolenbroek {"capwap-ac-v4", "Ia", &dhcp_universe, 138, 1 },
245*83ee113eSDavid van Moolenbroek #endif
246*83ee113eSDavid van Moolenbroek #if defined(RFC6731_OPTIONS)
247*83ee113eSDavid van Moolenbroek { "rdnss-selection", "BIID", &dhcp_universe, 146, 1 },
248*83ee113eSDavid van Moolenbroek #endif
249*83ee113eSDavid van Moolenbroek #if 0
250*83ee113eSDavid van Moolenbroek /* Not defined by RFC yet */
251*83ee113eSDavid van Moolenbroek { "tftp-server-address", "Ia", &dhcp_universe, 150, 1 },
252*83ee113eSDavid van Moolenbroek #endif
253*83ee113eSDavid van Moolenbroek #if 0
254*83ee113eSDavid van Moolenbroek /* PXELINUX options: defined by RFC 5071 */
255*83ee113eSDavid van Moolenbroek { "pxelinux-magic", "BBBB", &dhcp_universe, 208, 1 },
256*83ee113eSDavid van Moolenbroek { "loader-configfile", "t", &dhcp_universe, 209, 1 },
257*83ee113eSDavid van Moolenbroek { "loader-pathprefix", "t", &dhcp_universe, 210, 1 },
258*83ee113eSDavid van Moolenbroek { "loader-reboottime", "L", &dhcp_universe, 211, 1 },
259*83ee113eSDavid van Moolenbroek #endif
260*83ee113eSDavid van Moolenbroek #if defined(RFC5969_OPTIONS)
261*83ee113eSDavid van Moolenbroek { "option-6rd", "BB6Ia", &dhcp_universe, 212, 1 },
262*83ee113eSDavid van Moolenbroek #endif
263*83ee113eSDavid van Moolenbroek #if defined(RFC5986_OPTIONS)
264*83ee113eSDavid van Moolenbroek {"v4-access-domain", "d", &dhcp_universe, 213, 1 },
265*83ee113eSDavid van Moolenbroek #endif
266*83ee113eSDavid van Moolenbroek { NULL, NULL, NULL, 0, 0 }
267*83ee113eSDavid van Moolenbroek };
268*83ee113eSDavid van Moolenbroek
269*83ee113eSDavid van Moolenbroek struct universe nwip_universe;
270*83ee113eSDavid van Moolenbroek static struct option nwip_options[] = {
271*83ee113eSDavid van Moolenbroek { "illegal-1", "", &nwip_universe, 1, 1 },
272*83ee113eSDavid van Moolenbroek { "illegal-2", "", &nwip_universe, 2, 1 },
273*83ee113eSDavid van Moolenbroek { "illegal-3", "", &nwip_universe, 3, 1 },
274*83ee113eSDavid van Moolenbroek { "illegal-4", "", &nwip_universe, 4, 1 },
275*83ee113eSDavid van Moolenbroek { "nsq-broadcast", "f", &nwip_universe, 5, 1 },
276*83ee113eSDavid van Moolenbroek { "preferred-dss", "IA", &nwip_universe, 6, 1 },
277*83ee113eSDavid van Moolenbroek { "nearest-nwip-server", "IA", &nwip_universe, 7, 1 },
278*83ee113eSDavid van Moolenbroek { "autoretries", "B", &nwip_universe, 8, 1 },
279*83ee113eSDavid van Moolenbroek { "autoretry-secs", "B", &nwip_universe, 9, 1 },
280*83ee113eSDavid van Moolenbroek { "nwip-1-1", "f", &nwip_universe, 10, 1 },
281*83ee113eSDavid van Moolenbroek { "primary-dss", "I", &nwip_universe, 11, 1 },
282*83ee113eSDavid van Moolenbroek { NULL, NULL, NULL, 0, 0 }
283*83ee113eSDavid van Moolenbroek };
284*83ee113eSDavid van Moolenbroek
285*83ee113eSDavid van Moolenbroek /* Note that the "FQDN suboption space" does not reflect the FQDN option
286*83ee113eSDavid van Moolenbroek * format - rather, this is a handy "virtualization" of a flat option
287*83ee113eSDavid van Moolenbroek * which makes manual configuration and presentation of some of its
288*83ee113eSDavid van Moolenbroek * contents easier (each of these suboptions is a fixed-space field within
289*83ee113eSDavid van Moolenbroek * the fqdn contents - domain and host names are derived from a common field,
290*83ee113eSDavid van Moolenbroek * and differ in the left and right hand side of the leftmost dot, fqdn is
291*83ee113eSDavid van Moolenbroek * the combination of the two).
292*83ee113eSDavid van Moolenbroek *
293*83ee113eSDavid van Moolenbroek * Note further that the DHCPv6 and DHCPv4 'fqdn' options use the same
294*83ee113eSDavid van Moolenbroek * virtualized option space to store their work.
295*83ee113eSDavid van Moolenbroek */
296*83ee113eSDavid van Moolenbroek
297*83ee113eSDavid van Moolenbroek struct universe fqdn_universe;
298*83ee113eSDavid van Moolenbroek struct universe fqdn6_universe;
299*83ee113eSDavid van Moolenbroek static struct option fqdn_options[] = {
300*83ee113eSDavid van Moolenbroek { "no-client-update", "f", &fqdn_universe, 1, 1 },
301*83ee113eSDavid van Moolenbroek { "server-update", "f", &fqdn_universe, 2, 1 },
302*83ee113eSDavid van Moolenbroek { "encoded", "f", &fqdn_universe, 3, 1 },
303*83ee113eSDavid van Moolenbroek { "rcode1", "B", &fqdn_universe, 4, 1 },
304*83ee113eSDavid van Moolenbroek { "rcode2", "B", &fqdn_universe, 5, 1 },
305*83ee113eSDavid van Moolenbroek { "hostname", "t", &fqdn_universe, 6, 1 },
306*83ee113eSDavid van Moolenbroek { "domainname", "t", &fqdn_universe, 7, 1 },
307*83ee113eSDavid van Moolenbroek { "fqdn", "t", &fqdn_universe, 8, 1 },
308*83ee113eSDavid van Moolenbroek { NULL, NULL, NULL, 0, 0 }
309*83ee113eSDavid van Moolenbroek };
310*83ee113eSDavid van Moolenbroek
311*83ee113eSDavid van Moolenbroek struct universe vendor_class_universe;
312*83ee113eSDavid van Moolenbroek static struct option vendor_class_options[] = {
313*83ee113eSDavid van Moolenbroek { "isc", "X", &vendor_class_universe, 2495, 1 },
314*83ee113eSDavid van Moolenbroek { NULL, NULL, NULL, 0, 0 }
315*83ee113eSDavid van Moolenbroek };
316*83ee113eSDavid van Moolenbroek
317*83ee113eSDavid van Moolenbroek struct universe vendor_universe;
318*83ee113eSDavid van Moolenbroek static struct option vendor_options[] = {
319*83ee113eSDavid van Moolenbroek { "isc", "Eisc.", &vendor_universe, 2495, 1 },
320*83ee113eSDavid van Moolenbroek { NULL, NULL, NULL, 0, 0 }
321*83ee113eSDavid van Moolenbroek };
322*83ee113eSDavid van Moolenbroek
323*83ee113eSDavid van Moolenbroek struct universe isc_universe;
324*83ee113eSDavid van Moolenbroek static struct option isc_options [] = {
325*83ee113eSDavid van Moolenbroek { "media", "t", &isc_universe, 1, 1 },
326*83ee113eSDavid van Moolenbroek { "update-assist", "X", &isc_universe, 2, 1 },
327*83ee113eSDavid van Moolenbroek { NULL, NULL, NULL, 0, 0 }
328*83ee113eSDavid van Moolenbroek };
329*83ee113eSDavid van Moolenbroek
330*83ee113eSDavid van Moolenbroek struct universe dhcpv6_universe;
331*83ee113eSDavid van Moolenbroek static struct option dhcpv6_options[] = {
332*83ee113eSDavid van Moolenbroek
333*83ee113eSDavid van Moolenbroek /* RFC3315 OPTIONS */
334*83ee113eSDavid van Moolenbroek
335*83ee113eSDavid van Moolenbroek /* Client and server DUIDs are opaque fields, but marking them
336*83ee113eSDavid van Moolenbroek * up somewhat makes configuration easier.
337*83ee113eSDavid van Moolenbroek */
338*83ee113eSDavid van Moolenbroek { "client-id", "X", &dhcpv6_universe, 1, 1 },
339*83ee113eSDavid van Moolenbroek { "server-id", "X", &dhcpv6_universe, 2, 1 },
340*83ee113eSDavid van Moolenbroek
341*83ee113eSDavid van Moolenbroek /* ia-* options actually have at their ends a space for options
342*83ee113eSDavid van Moolenbroek * that are specific to this instance of the option. We can not
343*83ee113eSDavid van Moolenbroek * handle this yet at this stage of development, so the encoding
344*83ee113eSDavid van Moolenbroek * of these options is unspecified ("X").
345*83ee113eSDavid van Moolenbroek */
346*83ee113eSDavid van Moolenbroek { "ia-na", "X", &dhcpv6_universe, 3, 1 },
347*83ee113eSDavid van Moolenbroek { "ia-ta", "X", &dhcpv6_universe, 4, 1 },
348*83ee113eSDavid van Moolenbroek { "ia-addr", "X", &dhcpv6_universe, 5, 1 },
349*83ee113eSDavid van Moolenbroek
350*83ee113eSDavid van Moolenbroek /* "oro" is DHCPv6 speak for "parameter-request-list" */
351*83ee113eSDavid van Moolenbroek { "oro", "SA", &dhcpv6_universe, 6, 1 },
352*83ee113eSDavid van Moolenbroek
353*83ee113eSDavid van Moolenbroek { "preference", "B", &dhcpv6_universe, 7, 1 },
354*83ee113eSDavid van Moolenbroek { "elapsed-time", "S", &dhcpv6_universe, 8, 1 },
355*83ee113eSDavid van Moolenbroek { "relay-msg", "X", &dhcpv6_universe, 9, 1 },
356*83ee113eSDavid van Moolenbroek
357*83ee113eSDavid van Moolenbroek /* Option code 10 is curiously unassigned. */
358*83ee113eSDavid van Moolenbroek /*
359*83ee113eSDavid van Moolenbroek * In draft-ietf-dhc-dhcpv6-25 there were two OPTION_CLIENT_MSG and
360*83ee113eSDavid van Moolenbroek * OPTION_SERVER_MSG options. They were eventually unified as
361*83ee113eSDavid van Moolenbroek * OPTION_RELAY_MSG, hence no option with value of 10.
362*83ee113eSDavid van Moolenbroek */
363*83ee113eSDavid van Moolenbroek #if 0
364*83ee113eSDavid van Moolenbroek /* XXX: missing suitable atoms for the auth option. We may want
365*83ee113eSDavid van Moolenbroek * to 'virtually encapsulate' this option a la the fqdn option
366*83ee113eSDavid van Moolenbroek * seeing as it is processed explicitly by the server and unlikely
367*83ee113eSDavid van Moolenbroek * to be configured by hand by users as such.
368*83ee113eSDavid van Moolenbroek */
369*83ee113eSDavid van Moolenbroek { "auth", "Nauth-protocol.Nauth-algorithm.Nrdm-type.LLX",
370*83ee113eSDavid van Moolenbroek &dhcpv6_universe, 11, 1 },
371*83ee113eSDavid van Moolenbroek #endif
372*83ee113eSDavid van Moolenbroek { "unicast", "6", &dhcpv6_universe, 12, 1 },
373*83ee113eSDavid van Moolenbroek { "status-code", "Nstatus-codes.to", &dhcpv6_universe, 13, 1 },
374*83ee113eSDavid van Moolenbroek { "rapid-commit", "Z", &dhcpv6_universe, 14, 1 },
375*83ee113eSDavid van Moolenbroek #if 0
376*83ee113eSDavid van Moolenbroek /* XXX: user-class contents are of the form "StA" where the
377*83ee113eSDavid van Moolenbroek * integer describes the length of the text field. We don't have
378*83ee113eSDavid van Moolenbroek * an atom for pre-determined-length octet strings yet, so we
379*83ee113eSDavid van Moolenbroek * can't quite do these two.
380*83ee113eSDavid van Moolenbroek */
381*83ee113eSDavid van Moolenbroek { "user-class", "X", &dhcpv6_universe, 15, 1 },
382*83ee113eSDavid van Moolenbroek { "vendor-class", "X", &dhcpv6_universe, 16, 1 },
383*83ee113eSDavid van Moolenbroek #endif
384*83ee113eSDavid van Moolenbroek { "vendor-opts", "Evsio.", &dhcpv6_universe, 17, 1 },
385*83ee113eSDavid van Moolenbroek { "interface-id", "X", &dhcpv6_universe, 18, 1 },
386*83ee113eSDavid van Moolenbroek { "reconf-msg", "Ndhcpv6-messages.", &dhcpv6_universe, 19, 1 },
387*83ee113eSDavid van Moolenbroek { "reconf-accept", "Z", &dhcpv6_universe, 20, 1 },
388*83ee113eSDavid van Moolenbroek
389*83ee113eSDavid van Moolenbroek /* RFC3319 OPTIONS */
390*83ee113eSDavid van Moolenbroek
391*83ee113eSDavid van Moolenbroek /* Of course: we would HAVE to have a different atom for
392*83ee113eSDavid van Moolenbroek * domain names without compression. Typical.
393*83ee113eSDavid van Moolenbroek */
394*83ee113eSDavid van Moolenbroek { "sip-servers-names", "D", &dhcpv6_universe, 21, 1 },
395*83ee113eSDavid van Moolenbroek { "sip-servers-addresses", "6A", &dhcpv6_universe, 22, 1 },
396*83ee113eSDavid van Moolenbroek
397*83ee113eSDavid van Moolenbroek /* RFC3646 OPTIONS */
398*83ee113eSDavid van Moolenbroek
399*83ee113eSDavid van Moolenbroek { "name-servers", "6A", &dhcpv6_universe, 23, 1 },
400*83ee113eSDavid van Moolenbroek { "domain-search", "D", &dhcpv6_universe, 24, 1 },
401*83ee113eSDavid van Moolenbroek
402*83ee113eSDavid van Moolenbroek /* RFC3633 OPTIONS */
403*83ee113eSDavid van Moolenbroek
404*83ee113eSDavid van Moolenbroek { "ia-pd", "X", &dhcpv6_universe, 25, 1 },
405*83ee113eSDavid van Moolenbroek { "ia-prefix", "X", &dhcpv6_universe, 26, 1 },
406*83ee113eSDavid van Moolenbroek
407*83ee113eSDavid van Moolenbroek /* RFC3898 OPTIONS */
408*83ee113eSDavid van Moolenbroek
409*83ee113eSDavid van Moolenbroek { "nis-servers", "6A", &dhcpv6_universe, 27, 1 },
410*83ee113eSDavid van Moolenbroek { "nisp-servers", "6A", &dhcpv6_universe, 28, 1 },
411*83ee113eSDavid van Moolenbroek { "nis-domain-name", "D", &dhcpv6_universe, 29, 1 },
412*83ee113eSDavid van Moolenbroek { "nisp-domain-name", "D", &dhcpv6_universe, 30, 1 },
413*83ee113eSDavid van Moolenbroek
414*83ee113eSDavid van Moolenbroek /* RFC4075 OPTIONS */
415*83ee113eSDavid van Moolenbroek { "sntp-servers", "6A", &dhcpv6_universe, 31, 1 },
416*83ee113eSDavid van Moolenbroek
417*83ee113eSDavid van Moolenbroek /* RFC4242 OPTIONS */
418*83ee113eSDavid van Moolenbroek
419*83ee113eSDavid van Moolenbroek { "info-refresh-time", "T", &dhcpv6_universe, 32, 1 },
420*83ee113eSDavid van Moolenbroek
421*83ee113eSDavid van Moolenbroek /* RFC4280 OPTIONS */
422*83ee113eSDavid van Moolenbroek
423*83ee113eSDavid van Moolenbroek { "bcms-server-d", "D", &dhcpv6_universe, 33, 1 },
424*83ee113eSDavid van Moolenbroek { "bcms-server-a", "6A", &dhcpv6_universe, 34, 1 },
425*83ee113eSDavid van Moolenbroek
426*83ee113eSDavid van Moolenbroek /* Note that 35 is not assigned. */
427*83ee113eSDavid van Moolenbroek
428*83ee113eSDavid van Moolenbroek #if defined(RFC4776_OPTIONS)
429*83ee113eSDavid van Moolenbroek /* RFC4776 OPTIONS */
430*83ee113eSDavid van Moolenbroek
431*83ee113eSDavid van Moolenbroek { "geoconf-civic", "X", &dhcpv6_universe, 36, 1 },
432*83ee113eSDavid van Moolenbroek #endif
433*83ee113eSDavid van Moolenbroek
434*83ee113eSDavid van Moolenbroek /* RFC4649 OPTIONS */
435*83ee113eSDavid van Moolenbroek
436*83ee113eSDavid van Moolenbroek /* The remote-id option looks like the VSIO option, but for all
437*83ee113eSDavid van Moolenbroek * intents and purposes we only need to treat the entire field
438*83ee113eSDavid van Moolenbroek * like a globally unique identifier (and if we create such an
439*83ee113eSDavid van Moolenbroek * option, ensure the first 4 bytes are our enterprise-id followed
440*83ee113eSDavid van Moolenbroek * by a globally unique ID so long as you're within that enterprise
441*83ee113eSDavid van Moolenbroek * id). So we'll use "X" for now unless someone grumbles.
442*83ee113eSDavid van Moolenbroek */
443*83ee113eSDavid van Moolenbroek { "remote-id", "X", &dhcpv6_universe, 37, 1 },
444*83ee113eSDavid van Moolenbroek
445*83ee113eSDavid van Moolenbroek /* RFC4580 OPTIONS */
446*83ee113eSDavid van Moolenbroek
447*83ee113eSDavid van Moolenbroek { "subscriber-id", "X", &dhcpv6_universe, 38, 1 },
448*83ee113eSDavid van Moolenbroek
449*83ee113eSDavid van Moolenbroek /* RFC4704 OPTIONS */
450*83ee113eSDavid van Moolenbroek
451*83ee113eSDavid van Moolenbroek /* The DHCPv6 FQDN option is...weird.
452*83ee113eSDavid van Moolenbroek *
453*83ee113eSDavid van Moolenbroek * We use the same "virtual" encapsulated space as DHCPv4's FQDN
454*83ee113eSDavid van Moolenbroek * option, so it can all be configured in one place. Since the
455*83ee113eSDavid van Moolenbroek * options system does not support multiple inheritance, we use
456*83ee113eSDavid van Moolenbroek * a 'shill' layer to perform the different protocol conversions,
457*83ee113eSDavid van Moolenbroek * and to redirect any queries in the DHCPv4 FQDN's space.
458*83ee113eSDavid van Moolenbroek */
459*83ee113eSDavid van Moolenbroek { "fqdn", "Efqdn6-if-you-see-me-its-a-bug-bug-bug.",
460*83ee113eSDavid van Moolenbroek &dhcpv6_universe, 39, 1 },
461*83ee113eSDavid van Moolenbroek
462*83ee113eSDavid van Moolenbroek
463*83ee113eSDavid van Moolenbroek /* RFC5192 */
464*83ee113eSDavid van Moolenbroek #if defined(RFC5192_OPTIONS)
465*83ee113eSDavid van Moolenbroek { "pana-agent", "6A", &dhcpv6_universe, 40, 1 },
466*83ee113eSDavid van Moolenbroek #endif
467*83ee113eSDavid van Moolenbroek
468*83ee113eSDavid van Moolenbroek /* RFC4833 OPTIONS */
469*83ee113eSDavid van Moolenbroek #if defined(RFC4833_OPTIONS)
470*83ee113eSDavid van Moolenbroek { "new-posix-timezone", "t", &dhcpv6_universe, 41, 1 },
471*83ee113eSDavid van Moolenbroek { "new-tzdb-timezone", "t", &dhcpv6_universe, 42, 1 },
472*83ee113eSDavid van Moolenbroek #endif
473*83ee113eSDavid van Moolenbroek
474*83ee113eSDavid van Moolenbroek /* RFC4994 OPTIONS */
475*83ee113eSDavid van Moolenbroek #if defined(RFC4994_OPTIONS)
476*83ee113eSDavid van Moolenbroek { "ero", "SA", &dhcpv6_universe, 43, 1 },
477*83ee113eSDavid van Moolenbroek #endif
478*83ee113eSDavid van Moolenbroek
479*83ee113eSDavid van Moolenbroek /* RFC5007 OPTIONS */
480*83ee113eSDavid van Moolenbroek
481*83ee113eSDavid van Moolenbroek { "lq-query", "X", &dhcpv6_universe, 44, 1 },
482*83ee113eSDavid van Moolenbroek { "client-data", "X", &dhcpv6_universe, 45, 1 },
483*83ee113eSDavid van Moolenbroek { "clt-time", "L", &dhcpv6_universe, 46, 1 },
484*83ee113eSDavid van Moolenbroek { "lq-relay-data", "6X", &dhcpv6_universe, 47, 1 },
485*83ee113eSDavid van Moolenbroek { "lq-client-link", "6A", &dhcpv6_universe, 48, 1 },
486*83ee113eSDavid van Moolenbroek
487*83ee113eSDavid van Moolenbroek /* RFC5223 OPTIONS */
488*83ee113eSDavid van Moolenbroek #if defined(RFC5223_OPTIONS)
489*83ee113eSDavid van Moolenbroek { "v6-lost", "d", &dhcpv6_universe, 51, 1 },
490*83ee113eSDavid van Moolenbroek #endif
491*83ee113eSDavid van Moolenbroek
492*83ee113eSDavid van Moolenbroek /* RFC5417 OPTIONS */
493*83ee113eSDavid van Moolenbroek #if defined(RFC5417_OPTIONS)
494*83ee113eSDavid van Moolenbroek { "capwap-ac-v6", "6a", &dhcpv6_universe, 52, 1 },
495*83ee113eSDavid van Moolenbroek #endif
496*83ee113eSDavid van Moolenbroek
497*83ee113eSDavid van Moolenbroek /* RFC5460 OPTIONS */
498*83ee113eSDavid van Moolenbroek #if defined(RFC5460_OPTIONS)
499*83ee113eSDavid van Moolenbroek { "relay-id", "X", &dhcpv6_universe, 53, 1 },
500*83ee113eSDavid van Moolenbroek #endif
501*83ee113eSDavid van Moolenbroek
502*83ee113eSDavid van Moolenbroek /* RFC5986 OPTIONS */
503*83ee113eSDavid van Moolenbroek #if defined(RFC5986_OPTIONS)
504*83ee113eSDavid van Moolenbroek { "v6-access-domain", "d", &dhcpv6_universe, 57, 1 },
505*83ee113eSDavid van Moolenbroek #endif
506*83ee113eSDavid van Moolenbroek
507*83ee113eSDavid van Moolenbroek /* RFC6011 OPTIONS */
508*83ee113eSDavid van Moolenbroek #if defined(RFC6011_OPTIONS)
509*83ee113eSDavid van Moolenbroek { "sip-ua-cs-list", "D", &dhcpv6_universe, 58, 1 },
510*83ee113eSDavid van Moolenbroek #endif
511*83ee113eSDavid van Moolenbroek
512*83ee113eSDavid van Moolenbroek /* RFC5970 OPTIONS */
513*83ee113eSDavid van Moolenbroek #if defined(RFC5970_OPTIONS)
514*83ee113eSDavid van Moolenbroek { "bootfile-url", "t", &dhcpv6_universe, 59, 1 },
515*83ee113eSDavid van Moolenbroek { "bootfile-param", "X", &dhcpv6_universe, 60, 1 },
516*83ee113eSDavid van Moolenbroek { "client-arch-type", "SA", &dhcpv6_universe, 61, 1 },
517*83ee113eSDavid van Moolenbroek { "nii", "BBB", &dhcpv6_universe, 62, 1 },
518*83ee113eSDavid van Moolenbroek #endif
519*83ee113eSDavid van Moolenbroek
520*83ee113eSDavid van Moolenbroek /* RFC6334 OPTIONS */
521*83ee113eSDavid van Moolenbroek #if defined(RFC6334_OPTIONS)
522*83ee113eSDavid van Moolenbroek { "aftr-name", "d", &dhcpv6_universe, 64, 1 },
523*83ee113eSDavid van Moolenbroek #endif
524*83ee113eSDavid van Moolenbroek
525*83ee113eSDavid van Moolenbroek /* RFC6440 OPTIONS */
526*83ee113eSDavid van Moolenbroek #if defined(RFC6440_OPTIONS)
527*83ee113eSDavid van Moolenbroek { "erp-local-domain-name", "d", &dhcpv6_universe, 65, 1 },
528*83ee113eSDavid van Moolenbroek #endif
529*83ee113eSDavid van Moolenbroek
530*83ee113eSDavid van Moolenbroek /* RFC6731 OPTIONS */
531*83ee113eSDavid van Moolenbroek #if defined(RFC6731_OPTIONS)
532*83ee113eSDavid van Moolenbroek { "rdnss-selection", "6BD", &dhcpv6_universe, 74, 1 },
533*83ee113eSDavid van Moolenbroek #endif
534*83ee113eSDavid van Moolenbroek
535*83ee113eSDavid van Moolenbroek /* RFC6939 OPTIONS */
536*83ee113eSDavid van Moolenbroek #if defined(RFC6939_OPTIONS)
537*83ee113eSDavid van Moolenbroek { "client-linklayer-addr", "X", &dhcpv6_universe, 79, 1 },
538*83ee113eSDavid van Moolenbroek #endif
539*83ee113eSDavid van Moolenbroek
540*83ee113eSDavid van Moolenbroek /* RFC6977 OPTIONS */
541*83ee113eSDavid van Moolenbroek #if defined(RFC6977_OPTIONS)
542*83ee113eSDavid van Moolenbroek { "link-address", "6", &dhcpv6_universe, 80, 1 },
543*83ee113eSDavid van Moolenbroek #endif
544*83ee113eSDavid van Moolenbroek
545*83ee113eSDavid van Moolenbroek /* RFC7083 OPTIONS */
546*83ee113eSDavid van Moolenbroek #if defined(RFC7083_OPTIONS)
547*83ee113eSDavid van Moolenbroek { "solmax-rt", "L", &dhcpv6_universe, 82, 1 },
548*83ee113eSDavid van Moolenbroek { "inf-max-rt", "L", &dhcpv6_universe, 83, 1 },
549*83ee113eSDavid van Moolenbroek #endif
550*83ee113eSDavid van Moolenbroek
551*83ee113eSDavid van Moolenbroek { NULL, NULL, NULL, 0, 0 }
552*83ee113eSDavid van Moolenbroek };
553*83ee113eSDavid van Moolenbroek
554*83ee113eSDavid van Moolenbroek struct enumeration_value dhcpv6_duid_type_values[] = {
555*83ee113eSDavid van Moolenbroek { "duid-llt", DUID_LLT }, /* Link-Local Plus Time */
556*83ee113eSDavid van Moolenbroek { "duid-en", DUID_EN }, /* DUID based upon enterprise-ID. */
557*83ee113eSDavid van Moolenbroek { "duid-ll", DUID_LL }, /* DUID from Link Local address only. */
558*83ee113eSDavid van Moolenbroek { NULL, 0 }
559*83ee113eSDavid van Moolenbroek };
560*83ee113eSDavid van Moolenbroek
561*83ee113eSDavid van Moolenbroek struct enumeration dhcpv6_duid_types = {
562*83ee113eSDavid van Moolenbroek NULL,
563*83ee113eSDavid van Moolenbroek "duid-types", 2,
564*83ee113eSDavid van Moolenbroek dhcpv6_duid_type_values
565*83ee113eSDavid van Moolenbroek };
566*83ee113eSDavid van Moolenbroek
567*83ee113eSDavid van Moolenbroek struct enumeration_value dhcpv6_status_code_values[] = {
568*83ee113eSDavid van Moolenbroek { "success", 0 }, /* Success */
569*83ee113eSDavid van Moolenbroek { "UnspecFail", 1 }, /* Failure, for unspecified reasons. */
570*83ee113eSDavid van Moolenbroek { "NoAddrsAvail", 2 }, /* Server has no addresses to assign. */
571*83ee113eSDavid van Moolenbroek { "NoBinding", 3 }, /* Client record (binding) unavailable. */
572*83ee113eSDavid van Moolenbroek { "NotOnLink", 4 }, /* Bad prefix for the link. */
573*83ee113eSDavid van Moolenbroek { "UseMulticast", 5 }, /* Not just good advice. It's the law. */
574*83ee113eSDavid van Moolenbroek { "NoPrefixAvail", 6 }, /* Server has no prefixes to assign. */
575*83ee113eSDavid van Moolenbroek { "UnknownQueryType", 7 }, /* Query-type unknown/unsupported. */
576*83ee113eSDavid van Moolenbroek { "MalformedQuery", 8 }, /* Leasequery not valid. */
577*83ee113eSDavid van Moolenbroek { "NotConfigured", 9 }, /* The target address is not in config. */
578*83ee113eSDavid van Moolenbroek { "NotAllowed", 10 }, /* Server doesn't allow the leasequery. */
579*83ee113eSDavid van Moolenbroek { NULL, 0 }
580*83ee113eSDavid van Moolenbroek };
581*83ee113eSDavid van Moolenbroek
582*83ee113eSDavid van Moolenbroek struct enumeration dhcpv6_status_codes = {
583*83ee113eSDavid van Moolenbroek NULL,
584*83ee113eSDavid van Moolenbroek "status-codes", 2,
585*83ee113eSDavid van Moolenbroek dhcpv6_status_code_values
586*83ee113eSDavid van Moolenbroek };
587*83ee113eSDavid van Moolenbroek
588*83ee113eSDavid van Moolenbroek struct enumeration_value lq6_query_type_values[] = {
589*83ee113eSDavid van Moolenbroek { "query-by-address", 1 },
590*83ee113eSDavid van Moolenbroek { "query-by-clientid", 2 },
591*83ee113eSDavid van Moolenbroek { NULL, 0 }
592*83ee113eSDavid van Moolenbroek };
593*83ee113eSDavid van Moolenbroek
594*83ee113eSDavid van Moolenbroek struct enumeration lq6_query_types = {
595*83ee113eSDavid van Moolenbroek NULL,
596*83ee113eSDavid van Moolenbroek "query-types", 2,
597*83ee113eSDavid van Moolenbroek lq6_query_type_values
598*83ee113eSDavid van Moolenbroek };
599*83ee113eSDavid van Moolenbroek
600*83ee113eSDavid van Moolenbroek struct enumeration_value dhcpv6_message_values[] = {
601*83ee113eSDavid van Moolenbroek { "SOLICIT", 1 },
602*83ee113eSDavid van Moolenbroek { "ADVERTISE", 2 },
603*83ee113eSDavid van Moolenbroek { "REQUEST", 3 },
604*83ee113eSDavid van Moolenbroek { "CONFIRM", 4 },
605*83ee113eSDavid van Moolenbroek { "RENEW", 5 },
606*83ee113eSDavid van Moolenbroek { "REBIND", 6 },
607*83ee113eSDavid van Moolenbroek { "REPLY", 7 },
608*83ee113eSDavid van Moolenbroek { "RELEASE", 8 },
609*83ee113eSDavid van Moolenbroek { "DECLINE", 9 },
610*83ee113eSDavid van Moolenbroek { "RECONFIGURE", 10 },
611*83ee113eSDavid van Moolenbroek { "INFORMATION-REQUEST", 11 },
612*83ee113eSDavid van Moolenbroek { "RELAY-FORW", 12 },
613*83ee113eSDavid van Moolenbroek { "RELAY-REPL", 13 },
614*83ee113eSDavid van Moolenbroek { "LEASEQUERY", 14 },
615*83ee113eSDavid van Moolenbroek { "LEASEQUERY-REPLY", 15 },
616*83ee113eSDavid van Moolenbroek { NULL, 0 }
617*83ee113eSDavid van Moolenbroek };
618*83ee113eSDavid van Moolenbroek
619*83ee113eSDavid van Moolenbroek /* Some code refers to a different table. */
620*83ee113eSDavid van Moolenbroek const char *dhcpv6_type_names[] = {
621*83ee113eSDavid van Moolenbroek NULL,
622*83ee113eSDavid van Moolenbroek "Solicit",
623*83ee113eSDavid van Moolenbroek "Advertise",
624*83ee113eSDavid van Moolenbroek "Request",
625*83ee113eSDavid van Moolenbroek "Confirm",
626*83ee113eSDavid van Moolenbroek "Renew",
627*83ee113eSDavid van Moolenbroek "Rebind",
628*83ee113eSDavid van Moolenbroek "Reply",
629*83ee113eSDavid van Moolenbroek "Release",
630*83ee113eSDavid van Moolenbroek "Decline",
631*83ee113eSDavid van Moolenbroek "Reconfigure",
632*83ee113eSDavid van Moolenbroek "Information-request",
633*83ee113eSDavid van Moolenbroek "Relay-forward",
634*83ee113eSDavid van Moolenbroek "Relay-reply",
635*83ee113eSDavid van Moolenbroek "Leasequery",
636*83ee113eSDavid van Moolenbroek "Leasequery-reply"
637*83ee113eSDavid van Moolenbroek };
638*83ee113eSDavid van Moolenbroek const int dhcpv6_type_name_max =
639*83ee113eSDavid van Moolenbroek (sizeof(dhcpv6_type_names) / sizeof(dhcpv6_type_names[0]));
640*83ee113eSDavid van Moolenbroek
641*83ee113eSDavid van Moolenbroek struct enumeration dhcpv6_messages = {
642*83ee113eSDavid van Moolenbroek NULL,
643*83ee113eSDavid van Moolenbroek "dhcpv6-messages", 1,
644*83ee113eSDavid van Moolenbroek dhcpv6_message_values
645*83ee113eSDavid van Moolenbroek };
646*83ee113eSDavid van Moolenbroek
647*83ee113eSDavid van Moolenbroek struct universe vsio_universe;
648*83ee113eSDavid van Moolenbroek static struct option vsio_options[] = {
649*83ee113eSDavid van Moolenbroek { "isc", "Eisc6.", &vsio_universe, 2495, 1 },
650*83ee113eSDavid van Moolenbroek { NULL, NULL, NULL, 0, 0 }
651*83ee113eSDavid van Moolenbroek };
652*83ee113eSDavid van Moolenbroek
653*83ee113eSDavid van Moolenbroek struct universe isc6_universe;
654*83ee113eSDavid van Moolenbroek static struct option isc6_options[] = {
655*83ee113eSDavid van Moolenbroek { "media", "t", &isc6_universe, 1, 1 },
656*83ee113eSDavid van Moolenbroek { "update-assist", "X", &isc6_universe, 2, 1 },
657*83ee113eSDavid van Moolenbroek { NULL, NULL, NULL, 0, 0 }
658*83ee113eSDavid van Moolenbroek };
659*83ee113eSDavid van Moolenbroek
660*83ee113eSDavid van Moolenbroek const char *hardware_types [] = {
661*83ee113eSDavid van Moolenbroek "unknown-0",
662*83ee113eSDavid van Moolenbroek "ethernet",
663*83ee113eSDavid van Moolenbroek "unknown-2",
664*83ee113eSDavid van Moolenbroek "unknown-3",
665*83ee113eSDavid van Moolenbroek "unknown-4",
666*83ee113eSDavid van Moolenbroek "unknown-5",
667*83ee113eSDavid van Moolenbroek "token-ring",
668*83ee113eSDavid van Moolenbroek "unknown-7",
669*83ee113eSDavid van Moolenbroek "fddi",
670*83ee113eSDavid van Moolenbroek "unknown-9",
671*83ee113eSDavid van Moolenbroek "unknown-10",
672*83ee113eSDavid van Moolenbroek "unknown-11",
673*83ee113eSDavid van Moolenbroek "unknown-12",
674*83ee113eSDavid van Moolenbroek "unknown-13",
675*83ee113eSDavid van Moolenbroek "unknown-14",
676*83ee113eSDavid van Moolenbroek "unknown-15",
677*83ee113eSDavid van Moolenbroek "unknown-16",
678*83ee113eSDavid van Moolenbroek "unknown-17",
679*83ee113eSDavid van Moolenbroek "unknown-18",
680*83ee113eSDavid van Moolenbroek "unknown-19",
681*83ee113eSDavid van Moolenbroek "unknown-20",
682*83ee113eSDavid van Moolenbroek "unknown-21",
683*83ee113eSDavid van Moolenbroek "unknown-22",
684*83ee113eSDavid van Moolenbroek "unknown-23",
685*83ee113eSDavid van Moolenbroek "unknown-24",
686*83ee113eSDavid van Moolenbroek "unknown-25",
687*83ee113eSDavid van Moolenbroek "unknown-26",
688*83ee113eSDavid van Moolenbroek "unknown-27",
689*83ee113eSDavid van Moolenbroek "unknown-28",
690*83ee113eSDavid van Moolenbroek "unknown-29",
691*83ee113eSDavid van Moolenbroek "unknown-30",
692*83ee113eSDavid van Moolenbroek "unknown-31",
693*83ee113eSDavid van Moolenbroek "infiniband",
694*83ee113eSDavid van Moolenbroek "unknown-33",
695*83ee113eSDavid van Moolenbroek "unknown-34",
696*83ee113eSDavid van Moolenbroek "unknown-35",
697*83ee113eSDavid van Moolenbroek "unknown-36",
698*83ee113eSDavid van Moolenbroek "unknown-37",
699*83ee113eSDavid van Moolenbroek "unknown-38",
700*83ee113eSDavid van Moolenbroek "unknown-39",
701*83ee113eSDavid van Moolenbroek "unknown-40",
702*83ee113eSDavid van Moolenbroek "unknown-41",
703*83ee113eSDavid van Moolenbroek "unknown-42",
704*83ee113eSDavid van Moolenbroek "unknown-43",
705*83ee113eSDavid van Moolenbroek "unknown-44",
706*83ee113eSDavid van Moolenbroek "unknown-45",
707*83ee113eSDavid van Moolenbroek "unknown-46",
708*83ee113eSDavid van Moolenbroek "unknown-47",
709*83ee113eSDavid van Moolenbroek "unknown-48",
710*83ee113eSDavid van Moolenbroek "unknown-49",
711*83ee113eSDavid van Moolenbroek "unknown-50",
712*83ee113eSDavid van Moolenbroek "unknown-51",
713*83ee113eSDavid van Moolenbroek "unknown-52",
714*83ee113eSDavid van Moolenbroek "unknown-53",
715*83ee113eSDavid van Moolenbroek "unknown-54",
716*83ee113eSDavid van Moolenbroek "unknown-55",
717*83ee113eSDavid van Moolenbroek "unknown-56",
718*83ee113eSDavid van Moolenbroek "unknown-57",
719*83ee113eSDavid van Moolenbroek "unknown-58",
720*83ee113eSDavid van Moolenbroek "unknown-59",
721*83ee113eSDavid van Moolenbroek "unknown-60",
722*83ee113eSDavid van Moolenbroek "unknown-61",
723*83ee113eSDavid van Moolenbroek "unknown-62",
724*83ee113eSDavid van Moolenbroek "unknown-63",
725*83ee113eSDavid van Moolenbroek "unknown-64",
726*83ee113eSDavid van Moolenbroek "unknown-65",
727*83ee113eSDavid van Moolenbroek "unknown-66",
728*83ee113eSDavid van Moolenbroek "unknown-67",
729*83ee113eSDavid van Moolenbroek "unknown-68",
730*83ee113eSDavid van Moolenbroek "unknown-69",
731*83ee113eSDavid van Moolenbroek "unknown-70",
732*83ee113eSDavid van Moolenbroek "unknown-71",
733*83ee113eSDavid van Moolenbroek "unknown-72",
734*83ee113eSDavid van Moolenbroek "unknown-73",
735*83ee113eSDavid van Moolenbroek "unknown-74",
736*83ee113eSDavid van Moolenbroek "unknown-75",
737*83ee113eSDavid van Moolenbroek "unknown-76",
738*83ee113eSDavid van Moolenbroek "unknown-77",
739*83ee113eSDavid van Moolenbroek "unknown-78",
740*83ee113eSDavid van Moolenbroek "unknown-79",
741*83ee113eSDavid van Moolenbroek "unknown-80",
742*83ee113eSDavid van Moolenbroek "unknown-81",
743*83ee113eSDavid van Moolenbroek "unknown-82",
744*83ee113eSDavid van Moolenbroek "unknown-83",
745*83ee113eSDavid van Moolenbroek "unknown-84",
746*83ee113eSDavid van Moolenbroek "unknown-85",
747*83ee113eSDavid van Moolenbroek "unknown-86",
748*83ee113eSDavid van Moolenbroek "unknown-87",
749*83ee113eSDavid van Moolenbroek "unknown-88",
750*83ee113eSDavid van Moolenbroek "unknown-89",
751*83ee113eSDavid van Moolenbroek "unknown-90",
752*83ee113eSDavid van Moolenbroek "unknown-91",
753*83ee113eSDavid van Moolenbroek "unknown-92",
754*83ee113eSDavid van Moolenbroek "unknown-93",
755*83ee113eSDavid van Moolenbroek "unknown-94",
756*83ee113eSDavid van Moolenbroek "unknown-95",
757*83ee113eSDavid van Moolenbroek "unknown-96",
758*83ee113eSDavid van Moolenbroek "unknown-97",
759*83ee113eSDavid van Moolenbroek "unknown-98",
760*83ee113eSDavid van Moolenbroek "unknown-99",
761*83ee113eSDavid van Moolenbroek "unknown-100",
762*83ee113eSDavid van Moolenbroek "unknown-101",
763*83ee113eSDavid van Moolenbroek "unknown-102",
764*83ee113eSDavid van Moolenbroek "unknown-103",
765*83ee113eSDavid van Moolenbroek "unknown-104",
766*83ee113eSDavid van Moolenbroek "unknown-105",
767*83ee113eSDavid van Moolenbroek "unknown-106",
768*83ee113eSDavid van Moolenbroek "unknown-107",
769*83ee113eSDavid van Moolenbroek "unknown-108",
770*83ee113eSDavid van Moolenbroek "unknown-109",
771*83ee113eSDavid van Moolenbroek "unknown-110",
772*83ee113eSDavid van Moolenbroek "unknown-111",
773*83ee113eSDavid van Moolenbroek "unknown-112",
774*83ee113eSDavid van Moolenbroek "unknown-113",
775*83ee113eSDavid van Moolenbroek "unknown-114",
776*83ee113eSDavid van Moolenbroek "unknown-115",
777*83ee113eSDavid van Moolenbroek "unknown-116",
778*83ee113eSDavid van Moolenbroek "unknown-117",
779*83ee113eSDavid van Moolenbroek "unknown-118",
780*83ee113eSDavid van Moolenbroek "unknown-119",
781*83ee113eSDavid van Moolenbroek "unknown-120",
782*83ee113eSDavid van Moolenbroek "unknown-121",
783*83ee113eSDavid van Moolenbroek "unknown-122",
784*83ee113eSDavid van Moolenbroek "unknown-123",
785*83ee113eSDavid van Moolenbroek "unknown-124",
786*83ee113eSDavid van Moolenbroek "unknown-125",
787*83ee113eSDavid van Moolenbroek "unknown-126",
788*83ee113eSDavid van Moolenbroek "unknown-127",
789*83ee113eSDavid van Moolenbroek "unknown-128",
790*83ee113eSDavid van Moolenbroek "unknown-129",
791*83ee113eSDavid van Moolenbroek "unknown-130",
792*83ee113eSDavid van Moolenbroek "unknown-131",
793*83ee113eSDavid van Moolenbroek "unknown-132",
794*83ee113eSDavid van Moolenbroek "unknown-133",
795*83ee113eSDavid van Moolenbroek "unknown-134",
796*83ee113eSDavid van Moolenbroek "unknown-135",
797*83ee113eSDavid van Moolenbroek "unknown-136",
798*83ee113eSDavid van Moolenbroek "unknown-137",
799*83ee113eSDavid van Moolenbroek "unknown-138",
800*83ee113eSDavid van Moolenbroek "unknown-139",
801*83ee113eSDavid van Moolenbroek "unknown-140",
802*83ee113eSDavid van Moolenbroek "unknown-141",
803*83ee113eSDavid van Moolenbroek "unknown-142",
804*83ee113eSDavid van Moolenbroek "unknown-143",
805*83ee113eSDavid van Moolenbroek "unknown-144",
806*83ee113eSDavid van Moolenbroek "unknown-145",
807*83ee113eSDavid van Moolenbroek "unknown-146",
808*83ee113eSDavid van Moolenbroek "unknown-147",
809*83ee113eSDavid van Moolenbroek "unknown-148",
810*83ee113eSDavid van Moolenbroek "unknown-149",
811*83ee113eSDavid van Moolenbroek "unknown-150",
812*83ee113eSDavid van Moolenbroek "unknown-151",
813*83ee113eSDavid van Moolenbroek "unknown-152",
814*83ee113eSDavid van Moolenbroek "unknown-153",
815*83ee113eSDavid van Moolenbroek "unknown-154",
816*83ee113eSDavid van Moolenbroek "unknown-155",
817*83ee113eSDavid van Moolenbroek "unknown-156",
818*83ee113eSDavid van Moolenbroek "unknown-157",
819*83ee113eSDavid van Moolenbroek "unknown-158",
820*83ee113eSDavid van Moolenbroek "unknown-159",
821*83ee113eSDavid van Moolenbroek "unknown-160",
822*83ee113eSDavid van Moolenbroek "unknown-161",
823*83ee113eSDavid van Moolenbroek "unknown-162",
824*83ee113eSDavid van Moolenbroek "unknown-163",
825*83ee113eSDavid van Moolenbroek "unknown-164",
826*83ee113eSDavid van Moolenbroek "unknown-165",
827*83ee113eSDavid van Moolenbroek "unknown-166",
828*83ee113eSDavid van Moolenbroek "unknown-167",
829*83ee113eSDavid van Moolenbroek "unknown-168",
830*83ee113eSDavid van Moolenbroek "unknown-169",
831*83ee113eSDavid van Moolenbroek "unknown-170",
832*83ee113eSDavid van Moolenbroek "unknown-171",
833*83ee113eSDavid van Moolenbroek "unknown-172",
834*83ee113eSDavid van Moolenbroek "unknown-173",
835*83ee113eSDavid van Moolenbroek "unknown-174",
836*83ee113eSDavid van Moolenbroek "unknown-175",
837*83ee113eSDavid van Moolenbroek "unknown-176",
838*83ee113eSDavid van Moolenbroek "unknown-177",
839*83ee113eSDavid van Moolenbroek "unknown-178",
840*83ee113eSDavid van Moolenbroek "unknown-179",
841*83ee113eSDavid van Moolenbroek "unknown-180",
842*83ee113eSDavid van Moolenbroek "unknown-181",
843*83ee113eSDavid van Moolenbroek "unknown-182",
844*83ee113eSDavid van Moolenbroek "unknown-183",
845*83ee113eSDavid van Moolenbroek "unknown-184",
846*83ee113eSDavid van Moolenbroek "unknown-185",
847*83ee113eSDavid van Moolenbroek "unknown-186",
848*83ee113eSDavid van Moolenbroek "unknown-187",
849*83ee113eSDavid van Moolenbroek "unknown-188",
850*83ee113eSDavid van Moolenbroek "unknown-189",
851*83ee113eSDavid van Moolenbroek "unknown-190",
852*83ee113eSDavid van Moolenbroek "unknown-191",
853*83ee113eSDavid van Moolenbroek "unknown-192",
854*83ee113eSDavid van Moolenbroek "unknown-193",
855*83ee113eSDavid van Moolenbroek "unknown-194",
856*83ee113eSDavid van Moolenbroek "unknown-195",
857*83ee113eSDavid van Moolenbroek "unknown-196",
858*83ee113eSDavid van Moolenbroek "unknown-197",
859*83ee113eSDavid van Moolenbroek "unknown-198",
860*83ee113eSDavid van Moolenbroek "unknown-199",
861*83ee113eSDavid van Moolenbroek "unknown-200",
862*83ee113eSDavid van Moolenbroek "unknown-201",
863*83ee113eSDavid van Moolenbroek "unknown-202",
864*83ee113eSDavid van Moolenbroek "unknown-203",
865*83ee113eSDavid van Moolenbroek "unknown-204",
866*83ee113eSDavid van Moolenbroek "unknown-205",
867*83ee113eSDavid van Moolenbroek "unknown-206",
868*83ee113eSDavid van Moolenbroek "unknown-207",
869*83ee113eSDavid van Moolenbroek "unknown-208",
870*83ee113eSDavid van Moolenbroek "unknown-209",
871*83ee113eSDavid van Moolenbroek "unknown-210",
872*83ee113eSDavid van Moolenbroek "unknown-211",
873*83ee113eSDavid van Moolenbroek "unknown-212",
874*83ee113eSDavid van Moolenbroek "unknown-213",
875*83ee113eSDavid van Moolenbroek "unknown-214",
876*83ee113eSDavid van Moolenbroek "unknown-215",
877*83ee113eSDavid van Moolenbroek "unknown-216",
878*83ee113eSDavid van Moolenbroek "unknown-217",
879*83ee113eSDavid van Moolenbroek "unknown-218",
880*83ee113eSDavid van Moolenbroek "unknown-219",
881*83ee113eSDavid van Moolenbroek "unknown-220",
882*83ee113eSDavid van Moolenbroek "unknown-221",
883*83ee113eSDavid van Moolenbroek "unknown-222",
884*83ee113eSDavid van Moolenbroek "unknown-223",
885*83ee113eSDavid van Moolenbroek "unknown-224",
886*83ee113eSDavid van Moolenbroek "unknown-225",
887*83ee113eSDavid van Moolenbroek "unknown-226",
888*83ee113eSDavid van Moolenbroek "unknown-227",
889*83ee113eSDavid van Moolenbroek "unknown-228",
890*83ee113eSDavid van Moolenbroek "unknown-229",
891*83ee113eSDavid van Moolenbroek "unknown-230",
892*83ee113eSDavid van Moolenbroek "unknown-231",
893*83ee113eSDavid van Moolenbroek "unknown-232",
894*83ee113eSDavid van Moolenbroek "unknown-233",
895*83ee113eSDavid van Moolenbroek "unknown-234",
896*83ee113eSDavid van Moolenbroek "unknown-235",
897*83ee113eSDavid van Moolenbroek "unknown-236",
898*83ee113eSDavid van Moolenbroek "unknown-237",
899*83ee113eSDavid van Moolenbroek "unknown-238",
900*83ee113eSDavid van Moolenbroek "unknown-239",
901*83ee113eSDavid van Moolenbroek "unknown-240",
902*83ee113eSDavid van Moolenbroek "unknown-241",
903*83ee113eSDavid van Moolenbroek "unknown-242",
904*83ee113eSDavid van Moolenbroek "unknown-243",
905*83ee113eSDavid van Moolenbroek "unknown-244",
906*83ee113eSDavid van Moolenbroek "unknown-245",
907*83ee113eSDavid van Moolenbroek "unknown-246",
908*83ee113eSDavid van Moolenbroek "unknown-247",
909*83ee113eSDavid van Moolenbroek "unknown-248",
910*83ee113eSDavid van Moolenbroek "unknown-249",
911*83ee113eSDavid van Moolenbroek "unknown-250",
912*83ee113eSDavid van Moolenbroek "unknown-251",
913*83ee113eSDavid van Moolenbroek "unknown-252",
914*83ee113eSDavid van Moolenbroek "unknown-253",
915*83ee113eSDavid van Moolenbroek "unknown-254",
916*83ee113eSDavid van Moolenbroek "unknown-255" };
917*83ee113eSDavid van Moolenbroek
918*83ee113eSDavid van Moolenbroek universe_hash_t *universe_hash;
919*83ee113eSDavid van Moolenbroek struct universe **universes;
920*83ee113eSDavid van Moolenbroek int universe_count, universe_max;
921*83ee113eSDavid van Moolenbroek
922*83ee113eSDavid van Moolenbroek /* Universe containing names of configuration options, which, rather than
923*83ee113eSDavid van Moolenbroek writing "option universe-name.option-name ...;", can be set by writing
924*83ee113eSDavid van Moolenbroek "option-name ...;". */
925*83ee113eSDavid van Moolenbroek
926*83ee113eSDavid van Moolenbroek struct universe *config_universe;
927*83ee113eSDavid van Moolenbroek
928*83ee113eSDavid van Moolenbroek /* XXX: omapi must die...all the below keeps us from having to make the
929*83ee113eSDavid van Moolenbroek * option structures omapi typed objects, which is a bigger headache.
930*83ee113eSDavid van Moolenbroek */
931*83ee113eSDavid van Moolenbroek
932*83ee113eSDavid van Moolenbroek char *default_option_format = (char *) "X";
933*83ee113eSDavid van Moolenbroek
934*83ee113eSDavid van Moolenbroek /* Must match hash_reference/dereference types in omapip/hash.h. */
935*83ee113eSDavid van Moolenbroek int
option_reference(struct option ** dest,struct option * src,const char * file,int line)936*83ee113eSDavid van Moolenbroek option_reference(struct option **dest, struct option *src,
937*83ee113eSDavid van Moolenbroek const char * file, int line)
938*83ee113eSDavid van Moolenbroek {
939*83ee113eSDavid van Moolenbroek if (!dest || !src)
940*83ee113eSDavid van Moolenbroek return DHCP_R_INVALIDARG;
941*83ee113eSDavid van Moolenbroek
942*83ee113eSDavid van Moolenbroek if (*dest) {
943*83ee113eSDavid van Moolenbroek #if defined(POINTER_DEBUG)
944*83ee113eSDavid van Moolenbroek log_fatal("%s(%d): reference store into non-null pointer!",
945*83ee113eSDavid van Moolenbroek file, line);
946*83ee113eSDavid van Moolenbroek #else
947*83ee113eSDavid van Moolenbroek return DHCP_R_INVALIDARG;
948*83ee113eSDavid van Moolenbroek #endif
949*83ee113eSDavid van Moolenbroek }
950*83ee113eSDavid van Moolenbroek
951*83ee113eSDavid van Moolenbroek *dest = src;
952*83ee113eSDavid van Moolenbroek src->refcnt++;
953*83ee113eSDavid van Moolenbroek rc_register(file, line, dest, src, src->refcnt, 0, RC_MISC);
954*83ee113eSDavid van Moolenbroek return(ISC_R_SUCCESS);
955*83ee113eSDavid van Moolenbroek }
956*83ee113eSDavid van Moolenbroek
957*83ee113eSDavid van Moolenbroek int
option_dereference(struct option ** dest,const char * file,int line)958*83ee113eSDavid van Moolenbroek option_dereference(struct option **dest, const char *file, int line)
959*83ee113eSDavid van Moolenbroek {
960*83ee113eSDavid van Moolenbroek if (!dest)
961*83ee113eSDavid van Moolenbroek return DHCP_R_INVALIDARG;
962*83ee113eSDavid van Moolenbroek
963*83ee113eSDavid van Moolenbroek if (!*dest) {
964*83ee113eSDavid van Moolenbroek #if defined (POINTER_DEBUG)
965*83ee113eSDavid van Moolenbroek log_fatal("%s(%d): dereference of null pointer!", file, line);
966*83ee113eSDavid van Moolenbroek #else
967*83ee113eSDavid van Moolenbroek return DHCP_R_INVALIDARG;
968*83ee113eSDavid van Moolenbroek #endif
969*83ee113eSDavid van Moolenbroek }
970*83ee113eSDavid van Moolenbroek
971*83ee113eSDavid van Moolenbroek if ((*dest)->refcnt <= 0) {
972*83ee113eSDavid van Moolenbroek #if defined (POINTER_DEBUG)
973*83ee113eSDavid van Moolenbroek log_fatal("%s(%d): dereference of <= 0 refcnt!", file, line);
974*83ee113eSDavid van Moolenbroek #else
975*83ee113eSDavid van Moolenbroek return DHCP_R_INVALIDARG;
976*83ee113eSDavid van Moolenbroek #endif
977*83ee113eSDavid van Moolenbroek }
978*83ee113eSDavid van Moolenbroek
979*83ee113eSDavid van Moolenbroek (*dest)->refcnt--;
980*83ee113eSDavid van Moolenbroek
981*83ee113eSDavid van Moolenbroek rc_register(file, line, dest, (*dest), (*dest)->refcnt, 1, RC_MISC);
982*83ee113eSDavid van Moolenbroek
983*83ee113eSDavid van Moolenbroek if ((*dest)->refcnt == 0) {
984*83ee113eSDavid van Moolenbroek /* The option name may be packed in the same alloc as the
985*83ee113eSDavid van Moolenbroek * option structure.
986*83ee113eSDavid van Moolenbroek */
987*83ee113eSDavid van Moolenbroek if ((char *) (*dest)->name != (char *) ((*dest) + 1))
988*83ee113eSDavid van Moolenbroek dfree((char *) (*dest)->name, file, line);
989*83ee113eSDavid van Moolenbroek
990*83ee113eSDavid van Moolenbroek /* It's either a user-configured format (allocated), or the
991*83ee113eSDavid van Moolenbroek * default static format.
992*83ee113eSDavid van Moolenbroek */
993*83ee113eSDavid van Moolenbroek if (((*dest)->format != NULL) &&
994*83ee113eSDavid van Moolenbroek ((*dest)->format != default_option_format)) {
995*83ee113eSDavid van Moolenbroek dfree((char *) (*dest)->format, file, line);
996*83ee113eSDavid van Moolenbroek }
997*83ee113eSDavid van Moolenbroek
998*83ee113eSDavid van Moolenbroek dfree(*dest, file, line);
999*83ee113eSDavid van Moolenbroek }
1000*83ee113eSDavid van Moolenbroek
1001*83ee113eSDavid van Moolenbroek *dest = NULL;
1002*83ee113eSDavid van Moolenbroek return ISC_R_SUCCESS;
1003*83ee113eSDavid van Moolenbroek }
1004*83ee113eSDavid van Moolenbroek
initialize_common_option_spaces()1005*83ee113eSDavid van Moolenbroek void initialize_common_option_spaces()
1006*83ee113eSDavid van Moolenbroek {
1007*83ee113eSDavid van Moolenbroek unsigned code;
1008*83ee113eSDavid van Moolenbroek int i;
1009*83ee113eSDavid van Moolenbroek
1010*83ee113eSDavid van Moolenbroek /* The 'universes' table is dynamically grown to contain
1011*83ee113eSDavid van Moolenbroek * universe as they're configured - except during startup.
1012*83ee113eSDavid van Moolenbroek * Since we know how many we put down in .c files, we can
1013*83ee113eSDavid van Moolenbroek * allocate a more-than-right-sized buffer now, leaving some
1014*83ee113eSDavid van Moolenbroek * space for user-configured option spaces.
1015*83ee113eSDavid van Moolenbroek *
1016*83ee113eSDavid van Moolenbroek * 1: dhcp_universe (dhcpv4 options)
1017*83ee113eSDavid van Moolenbroek * 2: nwip_universe (dhcpv4 NWIP option)
1018*83ee113eSDavid van Moolenbroek * 3: fqdn_universe (dhcpv4 fqdn option - reusable for v6)
1019*83ee113eSDavid van Moolenbroek * 4: vendor_class_universe (VIVCO)
1020*83ee113eSDavid van Moolenbroek * 5: vendor_universe (VIVSO)
1021*83ee113eSDavid van Moolenbroek * 6: isc_universe (dhcpv4 isc config space)
1022*83ee113eSDavid van Moolenbroek * 7: dhcpv6_universe (dhcpv6 options)
1023*83ee113eSDavid van Moolenbroek * 8: vsio_universe (DHCPv6 Vendor-Identified space)
1024*83ee113eSDavid van Moolenbroek * 9: isc6_universe (ISC's Vendor universe in DHCPv6 VSIO)
1025*83ee113eSDavid van Moolenbroek * 10: fqdn6_universe (dhcpv6 fqdn option shill to v4)
1026*83ee113eSDavid van Moolenbroek * 11: agent_universe (dhcpv4 relay agent - see server/stables.c)
1027*83ee113eSDavid van Moolenbroek * 12: server_universe (server's config, see server/stables.c)
1028*83ee113eSDavid van Moolenbroek * 13: user-config
1029*83ee113eSDavid van Moolenbroek * 14: more user-config
1030*83ee113eSDavid van Moolenbroek * 15: more user-config
1031*83ee113eSDavid van Moolenbroek * 16: more user-config
1032*83ee113eSDavid van Moolenbroek */
1033*83ee113eSDavid van Moolenbroek universe_max = 16;
1034*83ee113eSDavid van Moolenbroek i = universe_max * sizeof(struct universe *);
1035*83ee113eSDavid van Moolenbroek if (i <= 0)
1036*83ee113eSDavid van Moolenbroek log_fatal("Ludicrous initial size option space table.");
1037*83ee113eSDavid van Moolenbroek universes = dmalloc(i, MDL);
1038*83ee113eSDavid van Moolenbroek if (universes == NULL)
1039*83ee113eSDavid van Moolenbroek log_fatal("Can't allocate option space table.");
1040*83ee113eSDavid van Moolenbroek memset(universes, 0, i);
1041*83ee113eSDavid van Moolenbroek
1042*83ee113eSDavid van Moolenbroek /* Set up the DHCP option universe... */
1043*83ee113eSDavid van Moolenbroek dhcp_universe.name = "dhcp";
1044*83ee113eSDavid van Moolenbroek dhcp_universe.concat_duplicates = 1;
1045*83ee113eSDavid van Moolenbroek dhcp_universe.lookup_func = lookup_hashed_option;
1046*83ee113eSDavid van Moolenbroek dhcp_universe.option_state_dereference =
1047*83ee113eSDavid van Moolenbroek hashed_option_state_dereference;
1048*83ee113eSDavid van Moolenbroek dhcp_universe.save_func = save_hashed_option;
1049*83ee113eSDavid van Moolenbroek dhcp_universe.delete_func = delete_hashed_option;
1050*83ee113eSDavid van Moolenbroek dhcp_universe.encapsulate = hashed_option_space_encapsulate;
1051*83ee113eSDavid van Moolenbroek dhcp_universe.foreach = hashed_option_space_foreach;
1052*83ee113eSDavid van Moolenbroek dhcp_universe.decode = parse_option_buffer;
1053*83ee113eSDavid van Moolenbroek dhcp_universe.length_size = 1;
1054*83ee113eSDavid van Moolenbroek dhcp_universe.tag_size = 1;
1055*83ee113eSDavid van Moolenbroek dhcp_universe.get_tag = getUChar;
1056*83ee113eSDavid van Moolenbroek dhcp_universe.store_tag = putUChar;
1057*83ee113eSDavid van Moolenbroek dhcp_universe.get_length = getUChar;
1058*83ee113eSDavid van Moolenbroek dhcp_universe.store_length = putUChar;
1059*83ee113eSDavid van Moolenbroek dhcp_universe.site_code_min = 0;
1060*83ee113eSDavid van Moolenbroek dhcp_universe.end = DHO_END;
1061*83ee113eSDavid van Moolenbroek dhcp_universe.index = universe_count++;
1062*83ee113eSDavid van Moolenbroek universes [dhcp_universe.index] = &dhcp_universe;
1063*83ee113eSDavid van Moolenbroek if (!option_name_new_hash(&dhcp_universe.name_hash,
1064*83ee113eSDavid van Moolenbroek BYTE_NAME_HASH_SIZE, MDL) ||
1065*83ee113eSDavid van Moolenbroek !option_code_new_hash(&dhcp_universe.code_hash,
1066*83ee113eSDavid van Moolenbroek BYTE_CODE_HASH_SIZE, MDL))
1067*83ee113eSDavid van Moolenbroek log_fatal ("Can't allocate dhcp option hash table.");
1068*83ee113eSDavid van Moolenbroek for (i = 0 ; dhcp_options[i].name ; i++) {
1069*83ee113eSDavid van Moolenbroek option_code_hash_add(dhcp_universe.code_hash,
1070*83ee113eSDavid van Moolenbroek &dhcp_options[i].code, 0,
1071*83ee113eSDavid van Moolenbroek &dhcp_options[i], MDL);
1072*83ee113eSDavid van Moolenbroek option_name_hash_add(dhcp_universe.name_hash,
1073*83ee113eSDavid van Moolenbroek dhcp_options [i].name, 0,
1074*83ee113eSDavid van Moolenbroek &dhcp_options [i], MDL);
1075*83ee113eSDavid van Moolenbroek }
1076*83ee113eSDavid van Moolenbroek #if defined(REPORT_HASH_PERFORMANCE)
1077*83ee113eSDavid van Moolenbroek log_info("DHCP name hash: %s",
1078*83ee113eSDavid van Moolenbroek option_name_hash_report(dhcp_universe.name_hash));
1079*83ee113eSDavid van Moolenbroek log_info("DHCP code hash: %s",
1080*83ee113eSDavid van Moolenbroek option_code_hash_report(dhcp_universe.code_hash));
1081*83ee113eSDavid van Moolenbroek #endif
1082*83ee113eSDavid van Moolenbroek
1083*83ee113eSDavid van Moolenbroek /* Set up the Novell option universe (for option 63)... */
1084*83ee113eSDavid van Moolenbroek nwip_universe.name = "nwip";
1085*83ee113eSDavid van Moolenbroek nwip_universe.concat_duplicates = 0; /* XXX: reference? */
1086*83ee113eSDavid van Moolenbroek nwip_universe.lookup_func = lookup_linked_option;
1087*83ee113eSDavid van Moolenbroek nwip_universe.option_state_dereference =
1088*83ee113eSDavid van Moolenbroek linked_option_state_dereference;
1089*83ee113eSDavid van Moolenbroek nwip_universe.save_func = save_linked_option;
1090*83ee113eSDavid van Moolenbroek nwip_universe.delete_func = delete_linked_option;
1091*83ee113eSDavid van Moolenbroek nwip_universe.encapsulate = nwip_option_space_encapsulate;
1092*83ee113eSDavid van Moolenbroek nwip_universe.foreach = linked_option_space_foreach;
1093*83ee113eSDavid van Moolenbroek nwip_universe.decode = parse_option_buffer;
1094*83ee113eSDavid van Moolenbroek nwip_universe.length_size = 1;
1095*83ee113eSDavid van Moolenbroek nwip_universe.tag_size = 1;
1096*83ee113eSDavid van Moolenbroek nwip_universe.get_tag = getUChar;
1097*83ee113eSDavid van Moolenbroek nwip_universe.store_tag = putUChar;
1098*83ee113eSDavid van Moolenbroek nwip_universe.get_length = getUChar;
1099*83ee113eSDavid van Moolenbroek nwip_universe.store_length = putUChar;
1100*83ee113eSDavid van Moolenbroek nwip_universe.site_code_min = 0;
1101*83ee113eSDavid van Moolenbroek nwip_universe.end = 0;
1102*83ee113eSDavid van Moolenbroek code = DHO_NWIP_SUBOPTIONS;
1103*83ee113eSDavid van Moolenbroek nwip_universe.enc_opt = NULL;
1104*83ee113eSDavid van Moolenbroek if (!option_code_hash_lookup(&nwip_universe.enc_opt,
1105*83ee113eSDavid van Moolenbroek dhcp_universe.code_hash, &code, 0, MDL))
1106*83ee113eSDavid van Moolenbroek log_fatal("Unable to find NWIP parent option (%s:%d).", MDL);
1107*83ee113eSDavid van Moolenbroek nwip_universe.index = universe_count++;
1108*83ee113eSDavid van Moolenbroek universes [nwip_universe.index] = &nwip_universe;
1109*83ee113eSDavid van Moolenbroek if (!option_name_new_hash(&nwip_universe.name_hash,
1110*83ee113eSDavid van Moolenbroek NWIP_HASH_SIZE, MDL) ||
1111*83ee113eSDavid van Moolenbroek !option_code_new_hash(&nwip_universe.code_hash,
1112*83ee113eSDavid van Moolenbroek NWIP_HASH_SIZE, MDL))
1113*83ee113eSDavid van Moolenbroek log_fatal ("Can't allocate nwip option hash table.");
1114*83ee113eSDavid van Moolenbroek for (i = 0 ; nwip_options[i].name ; i++) {
1115*83ee113eSDavid van Moolenbroek option_code_hash_add(nwip_universe.code_hash,
1116*83ee113eSDavid van Moolenbroek &nwip_options[i].code, 0,
1117*83ee113eSDavid van Moolenbroek &nwip_options[i], MDL);
1118*83ee113eSDavid van Moolenbroek option_name_hash_add(nwip_universe.name_hash,
1119*83ee113eSDavid van Moolenbroek nwip_options[i].name, 0,
1120*83ee113eSDavid van Moolenbroek &nwip_options[i], MDL);
1121*83ee113eSDavid van Moolenbroek }
1122*83ee113eSDavid van Moolenbroek #if defined(REPORT_HASH_PERFORMANCE)
1123*83ee113eSDavid van Moolenbroek log_info("NWIP name hash: %s",
1124*83ee113eSDavid van Moolenbroek option_name_hash_report(nwip_universe.name_hash));
1125*83ee113eSDavid van Moolenbroek log_info("NWIP code hash: %s",
1126*83ee113eSDavid van Moolenbroek option_code_hash_report(nwip_universe.code_hash));
1127*83ee113eSDavid van Moolenbroek #endif
1128*83ee113eSDavid van Moolenbroek
1129*83ee113eSDavid van Moolenbroek /* Set up the FQDN option universe... */
1130*83ee113eSDavid van Moolenbroek fqdn_universe.name = "fqdn";
1131*83ee113eSDavid van Moolenbroek fqdn_universe.concat_duplicates = 0;
1132*83ee113eSDavid van Moolenbroek fqdn_universe.lookup_func = lookup_linked_option;
1133*83ee113eSDavid van Moolenbroek fqdn_universe.option_state_dereference =
1134*83ee113eSDavid van Moolenbroek linked_option_state_dereference;
1135*83ee113eSDavid van Moolenbroek fqdn_universe.save_func = save_linked_option;
1136*83ee113eSDavid van Moolenbroek fqdn_universe.delete_func = delete_linked_option;
1137*83ee113eSDavid van Moolenbroek fqdn_universe.encapsulate = fqdn_option_space_encapsulate;
1138*83ee113eSDavid van Moolenbroek fqdn_universe.foreach = linked_option_space_foreach;
1139*83ee113eSDavid van Moolenbroek fqdn_universe.decode = fqdn_universe_decode;
1140*83ee113eSDavid van Moolenbroek fqdn_universe.length_size = 1;
1141*83ee113eSDavid van Moolenbroek fqdn_universe.tag_size = 1;
1142*83ee113eSDavid van Moolenbroek fqdn_universe.get_tag = getUChar;
1143*83ee113eSDavid van Moolenbroek fqdn_universe.store_tag = putUChar;
1144*83ee113eSDavid van Moolenbroek fqdn_universe.get_length = getUChar;
1145*83ee113eSDavid van Moolenbroek fqdn_universe.store_length = putUChar;
1146*83ee113eSDavid van Moolenbroek fqdn_universe.site_code_min = 0;
1147*83ee113eSDavid van Moolenbroek fqdn_universe.end = 0;
1148*83ee113eSDavid van Moolenbroek fqdn_universe.index = universe_count++;
1149*83ee113eSDavid van Moolenbroek code = DHO_FQDN;
1150*83ee113eSDavid van Moolenbroek fqdn_universe.enc_opt = NULL;
1151*83ee113eSDavid van Moolenbroek if (!option_code_hash_lookup(&fqdn_universe.enc_opt,
1152*83ee113eSDavid van Moolenbroek dhcp_universe.code_hash, &code, 0, MDL))
1153*83ee113eSDavid van Moolenbroek log_fatal("Unable to find FQDN parent option (%s:%d).", MDL);
1154*83ee113eSDavid van Moolenbroek universes [fqdn_universe.index] = &fqdn_universe;
1155*83ee113eSDavid van Moolenbroek if (!option_name_new_hash(&fqdn_universe.name_hash,
1156*83ee113eSDavid van Moolenbroek FQDN_HASH_SIZE, MDL) ||
1157*83ee113eSDavid van Moolenbroek !option_code_new_hash(&fqdn_universe.code_hash,
1158*83ee113eSDavid van Moolenbroek FQDN_HASH_SIZE, MDL))
1159*83ee113eSDavid van Moolenbroek log_fatal ("Can't allocate fqdn option hash table.");
1160*83ee113eSDavid van Moolenbroek for (i = 0 ; fqdn_options[i].name ; i++) {
1161*83ee113eSDavid van Moolenbroek option_code_hash_add(fqdn_universe.code_hash,
1162*83ee113eSDavid van Moolenbroek &fqdn_options[i].code, 0,
1163*83ee113eSDavid van Moolenbroek &fqdn_options[i], MDL);
1164*83ee113eSDavid van Moolenbroek option_name_hash_add(fqdn_universe.name_hash,
1165*83ee113eSDavid van Moolenbroek fqdn_options[i].name, 0,
1166*83ee113eSDavid van Moolenbroek &fqdn_options[i], MDL);
1167*83ee113eSDavid van Moolenbroek }
1168*83ee113eSDavid van Moolenbroek #if defined(REPORT_HASH_PERFORMANCE)
1169*83ee113eSDavid van Moolenbroek log_info("FQDN name hash: %s",
1170*83ee113eSDavid van Moolenbroek option_name_hash_report(fqdn_universe.name_hash));
1171*83ee113eSDavid van Moolenbroek log_info("FQDN code hash: %s",
1172*83ee113eSDavid van Moolenbroek option_code_hash_report(fqdn_universe.code_hash));
1173*83ee113eSDavid van Moolenbroek #endif
1174*83ee113eSDavid van Moolenbroek
1175*83ee113eSDavid van Moolenbroek /* Set up the Vendor Identified Vendor Class options (for option
1176*83ee113eSDavid van Moolenbroek * 125)...
1177*83ee113eSDavid van Moolenbroek */
1178*83ee113eSDavid van Moolenbroek vendor_class_universe.name = "vendor-class";
1179*83ee113eSDavid van Moolenbroek vendor_class_universe.concat_duplicates = 0; /* XXX: reference? */
1180*83ee113eSDavid van Moolenbroek vendor_class_universe.lookup_func = lookup_hashed_option;
1181*83ee113eSDavid van Moolenbroek vendor_class_universe.option_state_dereference =
1182*83ee113eSDavid van Moolenbroek hashed_option_state_dereference;
1183*83ee113eSDavid van Moolenbroek vendor_class_universe.save_func = save_hashed_option;
1184*83ee113eSDavid van Moolenbroek vendor_class_universe.delete_func = delete_hashed_option;
1185*83ee113eSDavid van Moolenbroek vendor_class_universe.encapsulate = hashed_option_space_encapsulate;
1186*83ee113eSDavid van Moolenbroek vendor_class_universe.foreach = hashed_option_space_foreach;
1187*83ee113eSDavid van Moolenbroek vendor_class_universe.decode = parse_option_buffer;
1188*83ee113eSDavid van Moolenbroek vendor_class_universe.length_size = 1;
1189*83ee113eSDavid van Moolenbroek vendor_class_universe.tag_size = 4;
1190*83ee113eSDavid van Moolenbroek vendor_class_universe.get_tag = getULong;
1191*83ee113eSDavid van Moolenbroek vendor_class_universe.store_tag = putULong;
1192*83ee113eSDavid van Moolenbroek vendor_class_universe.get_length = getUChar;
1193*83ee113eSDavid van Moolenbroek vendor_class_universe.store_length = putUChar;
1194*83ee113eSDavid van Moolenbroek vendor_class_universe.site_code_min = 0;
1195*83ee113eSDavid van Moolenbroek vendor_class_universe.end = 0;
1196*83ee113eSDavid van Moolenbroek code = DHO_VIVCO_SUBOPTIONS;
1197*83ee113eSDavid van Moolenbroek vendor_class_universe.enc_opt = NULL;
1198*83ee113eSDavid van Moolenbroek if (!option_code_hash_lookup(&vendor_class_universe.enc_opt,
1199*83ee113eSDavid van Moolenbroek dhcp_universe.code_hash, &code, 0, MDL))
1200*83ee113eSDavid van Moolenbroek log_fatal("Unable to find VIVCO parent option (%s:%d).", MDL);
1201*83ee113eSDavid van Moolenbroek vendor_class_universe.index = universe_count++;
1202*83ee113eSDavid van Moolenbroek universes[vendor_class_universe.index] = &vendor_class_universe;
1203*83ee113eSDavid van Moolenbroek if (!option_name_new_hash(&vendor_class_universe.name_hash,
1204*83ee113eSDavid van Moolenbroek VIVCO_HASH_SIZE, MDL) ||
1205*83ee113eSDavid van Moolenbroek !option_code_new_hash(&vendor_class_universe.code_hash,
1206*83ee113eSDavid van Moolenbroek VIVCO_HASH_SIZE, MDL))
1207*83ee113eSDavid van Moolenbroek log_fatal("Can't allocate Vendor Identified Vendor Class "
1208*83ee113eSDavid van Moolenbroek "option hash table.");
1209*83ee113eSDavid van Moolenbroek for (i = 0 ; vendor_class_options[i].name ; i++) {
1210*83ee113eSDavid van Moolenbroek option_code_hash_add(vendor_class_universe.code_hash,
1211*83ee113eSDavid van Moolenbroek &vendor_class_options[i].code, 0,
1212*83ee113eSDavid van Moolenbroek &vendor_class_options[i], MDL);
1213*83ee113eSDavid van Moolenbroek option_name_hash_add(vendor_class_universe.name_hash,
1214*83ee113eSDavid van Moolenbroek vendor_class_options[i].name, 0,
1215*83ee113eSDavid van Moolenbroek &vendor_class_options[i], MDL);
1216*83ee113eSDavid van Moolenbroek }
1217*83ee113eSDavid van Moolenbroek #if defined(REPORT_HASH_PERFORMANCE)
1218*83ee113eSDavid van Moolenbroek log_info("VIVCO name hash: %s",
1219*83ee113eSDavid van Moolenbroek option_name_hash_report(vendor_class_universe.name_hash));
1220*83ee113eSDavid van Moolenbroek log_info("VIVCO code hash: %s",
1221*83ee113eSDavid van Moolenbroek option_code_hash_report(vendor_class_universe.code_hash));
1222*83ee113eSDavid van Moolenbroek #endif
1223*83ee113eSDavid van Moolenbroek
1224*83ee113eSDavid van Moolenbroek /* Set up the Vendor Identified Vendor Sub-options (option 126)... */
1225*83ee113eSDavid van Moolenbroek vendor_universe.name = "vendor";
1226*83ee113eSDavid van Moolenbroek vendor_universe.concat_duplicates = 0; /* XXX: reference? */
1227*83ee113eSDavid van Moolenbroek vendor_universe.lookup_func = lookup_hashed_option;
1228*83ee113eSDavid van Moolenbroek vendor_universe.option_state_dereference =
1229*83ee113eSDavid van Moolenbroek hashed_option_state_dereference;
1230*83ee113eSDavid van Moolenbroek vendor_universe.save_func = save_hashed_option;
1231*83ee113eSDavid van Moolenbroek vendor_universe.delete_func = delete_hashed_option;
1232*83ee113eSDavid van Moolenbroek vendor_universe.encapsulate = hashed_option_space_encapsulate;
1233*83ee113eSDavid van Moolenbroek vendor_universe.foreach = hashed_option_space_foreach;
1234*83ee113eSDavid van Moolenbroek vendor_universe.decode = parse_option_buffer;
1235*83ee113eSDavid van Moolenbroek vendor_universe.length_size = 1;
1236*83ee113eSDavid van Moolenbroek vendor_universe.tag_size = 4;
1237*83ee113eSDavid van Moolenbroek vendor_universe.get_tag = getULong;
1238*83ee113eSDavid van Moolenbroek vendor_universe.store_tag = putULong;
1239*83ee113eSDavid van Moolenbroek vendor_universe.get_length = getUChar;
1240*83ee113eSDavid van Moolenbroek vendor_universe.store_length = putUChar;
1241*83ee113eSDavid van Moolenbroek vendor_universe.site_code_min = 0;
1242*83ee113eSDavid van Moolenbroek vendor_universe.end = 0;
1243*83ee113eSDavid van Moolenbroek code = DHO_VIVSO_SUBOPTIONS;
1244*83ee113eSDavid van Moolenbroek vendor_universe.enc_opt = NULL;
1245*83ee113eSDavid van Moolenbroek if (!option_code_hash_lookup(&vendor_universe.enc_opt,
1246*83ee113eSDavid van Moolenbroek dhcp_universe.code_hash, &code, 0, MDL))
1247*83ee113eSDavid van Moolenbroek log_fatal("Unable to find VIVSO parent option (%s:%d).", MDL);
1248*83ee113eSDavid van Moolenbroek vendor_universe.index = universe_count++;
1249*83ee113eSDavid van Moolenbroek universes[vendor_universe.index] = &vendor_universe;
1250*83ee113eSDavid van Moolenbroek if (!option_name_new_hash(&vendor_universe.name_hash,
1251*83ee113eSDavid van Moolenbroek VIVSO_HASH_SIZE, MDL) ||
1252*83ee113eSDavid van Moolenbroek !option_code_new_hash(&vendor_universe.code_hash,
1253*83ee113eSDavid van Moolenbroek VIVSO_HASH_SIZE, MDL))
1254*83ee113eSDavid van Moolenbroek log_fatal("Can't allocate Vendor Identified Vendor Sub-"
1255*83ee113eSDavid van Moolenbroek "options hash table.");
1256*83ee113eSDavid van Moolenbroek for (i = 0 ; vendor_options[i].name ; i++) {
1257*83ee113eSDavid van Moolenbroek option_code_hash_add(vendor_universe.code_hash,
1258*83ee113eSDavid van Moolenbroek &vendor_options[i].code, 0,
1259*83ee113eSDavid van Moolenbroek &vendor_options[i], MDL);
1260*83ee113eSDavid van Moolenbroek option_name_hash_add(vendor_universe.name_hash,
1261*83ee113eSDavid van Moolenbroek vendor_options[i].name, 0,
1262*83ee113eSDavid van Moolenbroek &vendor_options[i], MDL);
1263*83ee113eSDavid van Moolenbroek }
1264*83ee113eSDavid van Moolenbroek #if defined(REPORT_HASH_PERFORMANCE)
1265*83ee113eSDavid van Moolenbroek log_info("VIVSO name hash: %s",
1266*83ee113eSDavid van Moolenbroek option_name_hash_report(vendor_universe.name_hash));
1267*83ee113eSDavid van Moolenbroek log_info("VIVSO code hash: %s",
1268*83ee113eSDavid van Moolenbroek option_code_hash_report(vendor_universe.code_hash));
1269*83ee113eSDavid van Moolenbroek #endif
1270*83ee113eSDavid van Moolenbroek
1271*83ee113eSDavid van Moolenbroek /* Set up the ISC Vendor-option universe (for option 125.2495)... */
1272*83ee113eSDavid van Moolenbroek isc_universe.name = "isc";
1273*83ee113eSDavid van Moolenbroek isc_universe.concat_duplicates = 0; /* XXX: check VIVSO ref */
1274*83ee113eSDavid van Moolenbroek isc_universe.lookup_func = lookup_linked_option;
1275*83ee113eSDavid van Moolenbroek isc_universe.option_state_dereference =
1276*83ee113eSDavid van Moolenbroek linked_option_state_dereference;
1277*83ee113eSDavid van Moolenbroek isc_universe.save_func = save_linked_option;
1278*83ee113eSDavid van Moolenbroek isc_universe.delete_func = delete_linked_option;
1279*83ee113eSDavid van Moolenbroek isc_universe.encapsulate = linked_option_space_encapsulate;
1280*83ee113eSDavid van Moolenbroek isc_universe.foreach = linked_option_space_foreach;
1281*83ee113eSDavid van Moolenbroek isc_universe.decode = parse_option_buffer;
1282*83ee113eSDavid van Moolenbroek isc_universe.length_size = 2;
1283*83ee113eSDavid van Moolenbroek isc_universe.tag_size = 2;
1284*83ee113eSDavid van Moolenbroek isc_universe.get_tag = getUShort;
1285*83ee113eSDavid van Moolenbroek isc_universe.store_tag = putUShort;
1286*83ee113eSDavid van Moolenbroek isc_universe.get_length = getUShort;
1287*83ee113eSDavid van Moolenbroek isc_universe.store_length = putUShort;
1288*83ee113eSDavid van Moolenbroek isc_universe.site_code_min = 0;
1289*83ee113eSDavid van Moolenbroek isc_universe.end = 0;
1290*83ee113eSDavid van Moolenbroek code = VENDOR_ISC_SUBOPTIONS;
1291*83ee113eSDavid van Moolenbroek isc_universe.enc_opt = NULL;
1292*83ee113eSDavid van Moolenbroek if (!option_code_hash_lookup(&isc_universe.enc_opt,
1293*83ee113eSDavid van Moolenbroek vendor_universe.code_hash, &code, 0, MDL))
1294*83ee113eSDavid van Moolenbroek log_fatal("Unable to find ISC parent option (%s:%d).", MDL);
1295*83ee113eSDavid van Moolenbroek isc_universe.index = universe_count++;
1296*83ee113eSDavid van Moolenbroek universes[isc_universe.index] = &isc_universe;
1297*83ee113eSDavid van Moolenbroek if (!option_name_new_hash(&isc_universe.name_hash,
1298*83ee113eSDavid van Moolenbroek VIV_ISC_HASH_SIZE, MDL) ||
1299*83ee113eSDavid van Moolenbroek !option_code_new_hash(&isc_universe.code_hash,
1300*83ee113eSDavid van Moolenbroek VIV_ISC_HASH_SIZE, MDL))
1301*83ee113eSDavid van Moolenbroek log_fatal("Can't allocate ISC Vendor options hash table.");
1302*83ee113eSDavid van Moolenbroek for (i = 0 ; isc_options[i].name ; i++) {
1303*83ee113eSDavid van Moolenbroek option_code_hash_add(isc_universe.code_hash,
1304*83ee113eSDavid van Moolenbroek &isc_options[i].code, 0,
1305*83ee113eSDavid van Moolenbroek &isc_options[i], MDL);
1306*83ee113eSDavid van Moolenbroek option_name_hash_add(isc_universe.name_hash,
1307*83ee113eSDavid van Moolenbroek isc_options[i].name, 0,
1308*83ee113eSDavid van Moolenbroek &isc_options[i], MDL);
1309*83ee113eSDavid van Moolenbroek }
1310*83ee113eSDavid van Moolenbroek #if defined(REPORT_HASH_PERFORMANCE)
1311*83ee113eSDavid van Moolenbroek log_info("ISC name hash: %s",
1312*83ee113eSDavid van Moolenbroek option_name_hash_report(isc_universe.name_hash));
1313*83ee113eSDavid van Moolenbroek log_info("ISC code hash: %s",
1314*83ee113eSDavid van Moolenbroek option_code_hash_report(isc_universe.code_hash));
1315*83ee113eSDavid van Moolenbroek #endif
1316*83ee113eSDavid van Moolenbroek
1317*83ee113eSDavid van Moolenbroek /* Set up the DHCPv6 root universe. */
1318*83ee113eSDavid van Moolenbroek dhcpv6_universe.name = "dhcp6";
1319*83ee113eSDavid van Moolenbroek dhcpv6_universe.concat_duplicates = 0;
1320*83ee113eSDavid van Moolenbroek dhcpv6_universe.lookup_func = lookup_hashed_option;
1321*83ee113eSDavid van Moolenbroek dhcpv6_universe.option_state_dereference =
1322*83ee113eSDavid van Moolenbroek hashed_option_state_dereference;
1323*83ee113eSDavid van Moolenbroek dhcpv6_universe.save_func = save_hashed_option;
1324*83ee113eSDavid van Moolenbroek dhcpv6_universe.delete_func = delete_hashed_option;
1325*83ee113eSDavid van Moolenbroek dhcpv6_universe.encapsulate = hashed_option_space_encapsulate;
1326*83ee113eSDavid van Moolenbroek dhcpv6_universe.foreach = hashed_option_space_foreach;
1327*83ee113eSDavid van Moolenbroek dhcpv6_universe.decode = parse_option_buffer;
1328*83ee113eSDavid van Moolenbroek dhcpv6_universe.length_size = 2;
1329*83ee113eSDavid van Moolenbroek dhcpv6_universe.tag_size = 2;
1330*83ee113eSDavid van Moolenbroek dhcpv6_universe.get_tag = getUShort;
1331*83ee113eSDavid van Moolenbroek dhcpv6_universe.store_tag = putUShort;
1332*83ee113eSDavid van Moolenbroek dhcpv6_universe.get_length = getUShort;
1333*83ee113eSDavid van Moolenbroek dhcpv6_universe.store_length = putUShort;
1334*83ee113eSDavid van Moolenbroek dhcpv6_universe.site_code_min = 0;
1335*83ee113eSDavid van Moolenbroek /* DHCPv6 has no END option. */
1336*83ee113eSDavid van Moolenbroek dhcpv6_universe.end = 0x00;
1337*83ee113eSDavid van Moolenbroek dhcpv6_universe.index = universe_count++;
1338*83ee113eSDavid van Moolenbroek universes[dhcpv6_universe.index] = &dhcpv6_universe;
1339*83ee113eSDavid van Moolenbroek if (!option_name_new_hash(&dhcpv6_universe.name_hash,
1340*83ee113eSDavid van Moolenbroek WORD_NAME_HASH_SIZE, MDL) ||
1341*83ee113eSDavid van Moolenbroek !option_code_new_hash(&dhcpv6_universe.code_hash,
1342*83ee113eSDavid van Moolenbroek WORD_CODE_HASH_SIZE, MDL))
1343*83ee113eSDavid van Moolenbroek log_fatal("Can't allocate dhcpv6 option hash tables.");
1344*83ee113eSDavid van Moolenbroek for (i = 0 ; dhcpv6_options[i].name ; i++) {
1345*83ee113eSDavid van Moolenbroek option_code_hash_add(dhcpv6_universe.code_hash,
1346*83ee113eSDavid van Moolenbroek &dhcpv6_options[i].code, 0,
1347*83ee113eSDavid van Moolenbroek &dhcpv6_options[i], MDL);
1348*83ee113eSDavid van Moolenbroek option_name_hash_add(dhcpv6_universe.name_hash,
1349*83ee113eSDavid van Moolenbroek dhcpv6_options[i].name, 0,
1350*83ee113eSDavid van Moolenbroek &dhcpv6_options[i], MDL);
1351*83ee113eSDavid van Moolenbroek }
1352*83ee113eSDavid van Moolenbroek
1353*83ee113eSDavid van Moolenbroek /* Add DHCPv6 protocol enumeration sets. */
1354*83ee113eSDavid van Moolenbroek add_enumeration(&dhcpv6_duid_types);
1355*83ee113eSDavid van Moolenbroek add_enumeration(&dhcpv6_status_codes);
1356*83ee113eSDavid van Moolenbroek add_enumeration(&dhcpv6_messages);
1357*83ee113eSDavid van Moolenbroek
1358*83ee113eSDavid van Moolenbroek /* Set up DHCPv6 VSIO universe. */
1359*83ee113eSDavid van Moolenbroek vsio_universe.name = "vsio";
1360*83ee113eSDavid van Moolenbroek vsio_universe.concat_duplicates = 0;
1361*83ee113eSDavid van Moolenbroek vsio_universe.lookup_func = lookup_hashed_option;
1362*83ee113eSDavid van Moolenbroek vsio_universe.option_state_dereference =
1363*83ee113eSDavid van Moolenbroek hashed_option_state_dereference;
1364*83ee113eSDavid van Moolenbroek vsio_universe.save_func = save_hashed_option;
1365*83ee113eSDavid van Moolenbroek vsio_universe.delete_func = delete_hashed_option;
1366*83ee113eSDavid van Moolenbroek vsio_universe.encapsulate = hashed_option_space_encapsulate;
1367*83ee113eSDavid van Moolenbroek vsio_universe.foreach = hashed_option_space_foreach;
1368*83ee113eSDavid van Moolenbroek vsio_universe.decode = parse_option_buffer;
1369*83ee113eSDavid van Moolenbroek vsio_universe.length_size = 0;
1370*83ee113eSDavid van Moolenbroek vsio_universe.tag_size = 4;
1371*83ee113eSDavid van Moolenbroek vsio_universe.get_tag = getULong;
1372*83ee113eSDavid van Moolenbroek vsio_universe.store_tag = putULong;
1373*83ee113eSDavid van Moolenbroek vsio_universe.get_length = NULL;
1374*83ee113eSDavid van Moolenbroek vsio_universe.store_length = NULL;
1375*83ee113eSDavid van Moolenbroek vsio_universe.site_code_min = 0;
1376*83ee113eSDavid van Moolenbroek /* No END option. */
1377*83ee113eSDavid van Moolenbroek vsio_universe.end = 0x00;
1378*83ee113eSDavid van Moolenbroek code = D6O_VENDOR_OPTS;
1379*83ee113eSDavid van Moolenbroek if (!option_code_hash_lookup(&vsio_universe.enc_opt,
1380*83ee113eSDavid van Moolenbroek dhcpv6_universe.code_hash, &code, 0, MDL))
1381*83ee113eSDavid van Moolenbroek log_fatal("Unable to find VSIO parent option (%s:%d).", MDL);
1382*83ee113eSDavid van Moolenbroek vsio_universe.index = universe_count++;
1383*83ee113eSDavid van Moolenbroek universes[vsio_universe.index] = &vsio_universe;
1384*83ee113eSDavid van Moolenbroek if (!option_name_new_hash(&vsio_universe.name_hash,
1385*83ee113eSDavid van Moolenbroek VSIO_HASH_SIZE, MDL) ||
1386*83ee113eSDavid van Moolenbroek !option_code_new_hash(&vsio_universe.code_hash,
1387*83ee113eSDavid van Moolenbroek VSIO_HASH_SIZE, MDL))
1388*83ee113eSDavid van Moolenbroek log_fatal("Can't allocate Vendor Specific Information "
1389*83ee113eSDavid van Moolenbroek "Options space.");
1390*83ee113eSDavid van Moolenbroek for (i = 0 ; vsio_options[i].name != NULL ; i++) {
1391*83ee113eSDavid van Moolenbroek option_code_hash_add(vsio_universe.code_hash,
1392*83ee113eSDavid van Moolenbroek &vsio_options[i].code, 0,
1393*83ee113eSDavid van Moolenbroek &vsio_options[i], MDL);
1394*83ee113eSDavid van Moolenbroek option_name_hash_add(vsio_universe.name_hash,
1395*83ee113eSDavid van Moolenbroek vsio_options[i].name, 0,
1396*83ee113eSDavid van Moolenbroek &vsio_options[i], MDL);
1397*83ee113eSDavid van Moolenbroek }
1398*83ee113eSDavid van Moolenbroek
1399*83ee113eSDavid van Moolenbroek /* Add ISC VSIO sub-sub-option space. */
1400*83ee113eSDavid van Moolenbroek isc6_universe.name = "isc6";
1401*83ee113eSDavid van Moolenbroek isc6_universe.concat_duplicates = 0;
1402*83ee113eSDavid van Moolenbroek isc6_universe.lookup_func = lookup_hashed_option;
1403*83ee113eSDavid van Moolenbroek isc6_universe.option_state_dereference =
1404*83ee113eSDavid van Moolenbroek hashed_option_state_dereference;
1405*83ee113eSDavid van Moolenbroek isc6_universe.save_func = save_hashed_option;
1406*83ee113eSDavid van Moolenbroek isc6_universe.delete_func = delete_hashed_option;
1407*83ee113eSDavid van Moolenbroek isc6_universe.encapsulate = hashed_option_space_encapsulate;
1408*83ee113eSDavid van Moolenbroek isc6_universe.foreach = hashed_option_space_foreach;
1409*83ee113eSDavid van Moolenbroek isc6_universe.decode = parse_option_buffer;
1410*83ee113eSDavid van Moolenbroek isc6_universe.length_size = 0;
1411*83ee113eSDavid van Moolenbroek isc6_universe.tag_size = 4;
1412*83ee113eSDavid van Moolenbroek isc6_universe.get_tag = getULong;
1413*83ee113eSDavid van Moolenbroek isc6_universe.store_tag = putULong;
1414*83ee113eSDavid van Moolenbroek isc6_universe.get_length = NULL;
1415*83ee113eSDavid van Moolenbroek isc6_universe.store_length = NULL;
1416*83ee113eSDavid van Moolenbroek isc6_universe.site_code_min = 0;
1417*83ee113eSDavid van Moolenbroek /* No END option. */
1418*83ee113eSDavid van Moolenbroek isc6_universe.end = 0x00;
1419*83ee113eSDavid van Moolenbroek code = 2495;
1420*83ee113eSDavid van Moolenbroek if (!option_code_hash_lookup(&isc6_universe.enc_opt,
1421*83ee113eSDavid van Moolenbroek vsio_universe.code_hash, &code, 0, MDL))
1422*83ee113eSDavid van Moolenbroek log_fatal("Unable to find ISC parent option (%s:%d).", MDL);
1423*83ee113eSDavid van Moolenbroek isc6_universe.index = universe_count++;
1424*83ee113eSDavid van Moolenbroek universes[isc6_universe.index] = &isc6_universe;
1425*83ee113eSDavid van Moolenbroek if (!option_name_new_hash(&isc6_universe.name_hash,
1426*83ee113eSDavid van Moolenbroek VIV_ISC_HASH_SIZE, MDL) ||
1427*83ee113eSDavid van Moolenbroek !option_code_new_hash(&isc6_universe.code_hash,
1428*83ee113eSDavid van Moolenbroek VIV_ISC_HASH_SIZE, MDL))
1429*83ee113eSDavid van Moolenbroek log_fatal("Can't allocate Vendor Specific Information "
1430*83ee113eSDavid van Moolenbroek "Options space.");
1431*83ee113eSDavid van Moolenbroek for (i = 0 ; isc6_options[i].name != NULL ; i++) {
1432*83ee113eSDavid van Moolenbroek option_code_hash_add(isc6_universe.code_hash,
1433*83ee113eSDavid van Moolenbroek &isc6_options[i].code, 0,
1434*83ee113eSDavid van Moolenbroek &isc6_options[i], MDL);
1435*83ee113eSDavid van Moolenbroek option_name_hash_add(isc6_universe.name_hash,
1436*83ee113eSDavid van Moolenbroek isc6_options[i].name, 0,
1437*83ee113eSDavid van Moolenbroek &isc6_options[i], MDL);
1438*83ee113eSDavid van Moolenbroek }
1439*83ee113eSDavid van Moolenbroek
1440*83ee113eSDavid van Moolenbroek /* The fqdn6 option space is a protocol-wrapper shill for the
1441*83ee113eSDavid van Moolenbroek * old DHCPv4 space.
1442*83ee113eSDavid van Moolenbroek */
1443*83ee113eSDavid van Moolenbroek fqdn6_universe.name = "fqdn6-if-you-see-me-its-a-bug-bug-bug";
1444*83ee113eSDavid van Moolenbroek fqdn6_universe.lookup_func = lookup_fqdn6_option;
1445*83ee113eSDavid van Moolenbroek fqdn6_universe.option_state_dereference = NULL; /* Covered by v4. */
1446*83ee113eSDavid van Moolenbroek fqdn6_universe.save_func = save_fqdn6_option;
1447*83ee113eSDavid van Moolenbroek fqdn6_universe.delete_func = delete_fqdn6_option;
1448*83ee113eSDavid van Moolenbroek fqdn6_universe.encapsulate = fqdn6_option_space_encapsulate;
1449*83ee113eSDavid van Moolenbroek fqdn6_universe.foreach = fqdn6_option_space_foreach;
1450*83ee113eSDavid van Moolenbroek fqdn6_universe.decode = fqdn6_universe_decode;
1451*83ee113eSDavid van Moolenbroek /* This is not a 'normal' encapsulated space, so these values are
1452*83ee113eSDavid van Moolenbroek * meaningless.
1453*83ee113eSDavid van Moolenbroek */
1454*83ee113eSDavid van Moolenbroek fqdn6_universe.length_size = 0;
1455*83ee113eSDavid van Moolenbroek fqdn6_universe.tag_size = 0;
1456*83ee113eSDavid van Moolenbroek fqdn6_universe.get_tag = NULL;
1457*83ee113eSDavid van Moolenbroek fqdn6_universe.store_tag = NULL;
1458*83ee113eSDavid van Moolenbroek fqdn6_universe.get_length = NULL;
1459*83ee113eSDavid van Moolenbroek fqdn6_universe.store_length = NULL;
1460*83ee113eSDavid van Moolenbroek fqdn6_universe.site_code_min = 0;
1461*83ee113eSDavid van Moolenbroek fqdn6_universe.end = 0;
1462*83ee113eSDavid van Moolenbroek fqdn6_universe.index = universe_count++;
1463*83ee113eSDavid van Moolenbroek code = D6O_CLIENT_FQDN;
1464*83ee113eSDavid van Moolenbroek fqdn6_universe.enc_opt = NULL;
1465*83ee113eSDavid van Moolenbroek if (!option_code_hash_lookup(&fqdn6_universe.enc_opt,
1466*83ee113eSDavid van Moolenbroek dhcpv6_universe.code_hash, &code, 0, MDL))
1467*83ee113eSDavid van Moolenbroek log_fatal("Unable to find FQDN v6 parent option. (%s:%d).",
1468*83ee113eSDavid van Moolenbroek MDL);
1469*83ee113eSDavid van Moolenbroek universes[fqdn6_universe.index] = &fqdn6_universe;
1470*83ee113eSDavid van Moolenbroek /* The fqdn6 space shares the same option space as the v4 space.
1471*83ee113eSDavid van Moolenbroek * So there are no name or code hashes on the v6 side.
1472*83ee113eSDavid van Moolenbroek */
1473*83ee113eSDavid van Moolenbroek fqdn6_universe.name_hash = NULL;
1474*83ee113eSDavid van Moolenbroek fqdn6_universe.code_hash = NULL;
1475*83ee113eSDavid van Moolenbroek
1476*83ee113eSDavid van Moolenbroek
1477*83ee113eSDavid van Moolenbroek /* Set up the hash of DHCPv4 universes. */
1478*83ee113eSDavid van Moolenbroek universe_new_hash(&universe_hash, UNIVERSE_HASH_SIZE, MDL);
1479*83ee113eSDavid van Moolenbroek universe_hash_add(universe_hash, dhcp_universe.name, 0,
1480*83ee113eSDavid van Moolenbroek &dhcp_universe, MDL);
1481*83ee113eSDavid van Moolenbroek universe_hash_add(universe_hash, nwip_universe.name, 0,
1482*83ee113eSDavid van Moolenbroek &nwip_universe, MDL);
1483*83ee113eSDavid van Moolenbroek universe_hash_add(universe_hash, fqdn_universe.name, 0,
1484*83ee113eSDavid van Moolenbroek &fqdn_universe, MDL);
1485*83ee113eSDavid van Moolenbroek universe_hash_add(universe_hash, vendor_class_universe.name, 0,
1486*83ee113eSDavid van Moolenbroek &vendor_class_universe, MDL);
1487*83ee113eSDavid van Moolenbroek universe_hash_add(universe_hash, vendor_universe.name, 0,
1488*83ee113eSDavid van Moolenbroek &vendor_universe, MDL);
1489*83ee113eSDavid van Moolenbroek universe_hash_add(universe_hash, isc_universe.name, 0,
1490*83ee113eSDavid van Moolenbroek &isc_universe, MDL);
1491*83ee113eSDavid van Moolenbroek
1492*83ee113eSDavid van Moolenbroek /* Set up hashes for DHCPv6 universes. */
1493*83ee113eSDavid van Moolenbroek universe_hash_add(universe_hash, dhcpv6_universe.name, 0,
1494*83ee113eSDavid van Moolenbroek &dhcpv6_universe, MDL);
1495*83ee113eSDavid van Moolenbroek universe_hash_add(universe_hash, vsio_universe.name, 0,
1496*83ee113eSDavid van Moolenbroek &vsio_universe, MDL);
1497*83ee113eSDavid van Moolenbroek universe_hash_add(universe_hash, isc6_universe.name, 0,
1498*83ee113eSDavid van Moolenbroek &isc6_universe, MDL);
1499*83ee113eSDavid van Moolenbroek /* This should not be necessary. Listing here just for consistency.
1500*83ee113eSDavid van Moolenbroek * universe_hash_add(universe_hash, fqdn6_universe.name, 0,
1501*83ee113eSDavid van Moolenbroek * &fqdn6_universe, MDL);
1502*83ee113eSDavid van Moolenbroek */
1503*83ee113eSDavid van Moolenbroek }
1504