net-dhcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,621 @@
1
+ =begin
2
+ **
3
+ ** options.rb
4
+ ** 29/OCT/2007
5
+ ** ETD-Software
6
+ ** - Daniel Martin Gomez <etd[-at-]nomejortu.com>
7
+ **
8
+ ** Desc:
9
+ ** This file provides a set of classes to work with the DHCP protocol.
10
+ ** Here are defined the classes to work with the different options of the
11
+ ** protocol as defined in rfc2131, rfc2132 and rfc2563.
12
+ **
13
+ ** See the provided rdoc comments for further information.
14
+ **
15
+ ** Version:
16
+ ** v1.0 [29/October/2007]: first released
17
+ **
18
+ ** License:
19
+ ** Please see dhcp.rb or LICENSE.txt for copyright and licensing information.
20
+ **
21
+ =end
22
+
23
+ module DHCP
24
+
25
+ # General object to capture DHCP options. Every option of the protocol has
26
+ # three fields: an option *type*, a defined *length* and a *payload*
27
+ class Option
28
+ attr_accessor :type, :len, :payload
29
+
30
+ # Create a DHCP option object with the given *type* and *payload*. +params+
31
+ # must be an array containing at least these two keys: :*type* and :*payload*
32
+ # The length is calculated with the size of the payload
33
+ def initialize(params = {})
34
+ # We need a type, and a payload
35
+ if (([:type, :payload] & params.keys).size != 2)
36
+ raise ArgumentError('you need to specify values for :type and :payload')
37
+ end
38
+
39
+ self.type = params[:type]
40
+ self.payload = params[:payload]
41
+ self.len = params.fetch(:len, self.payload.size)
42
+ end
43
+
44
+ # Return the option packed as an array of bytes. The first two elements
45
+ # are the type and length of this option. The payload follows afterwards.
46
+ def to_a
47
+ return [self.type, self.len] + self.payload
48
+ end
49
+
50
+ # Return the option packed as a binary string.
51
+ def pack
52
+ (self.to_a).pack('C*')
53
+ end
54
+
55
+ # Check wether a given option is equivalent (protocol level) to this one.
56
+ def eql?(obj)
57
+ return false unless (self.class == obj.class)
58
+
59
+ vars = self.instance_variables
60
+ # check all the other instance vairables
61
+ vars.each do |var|
62
+ return false unless (self.instance_variable_get(var) == obj.instance_variable_get(var))
63
+ end
64
+ return true
65
+ end
66
+ alias == eql?
67
+
68
+ def to_s
69
+ "to_s NOT implemented for option type: #{self.type}"
70
+ end
71
+ end
72
+
73
+
74
+ # The subnet mask option specifies the client's subnet mask as per RFC
75
+ # 950 [5].
76
+ #
77
+ # If both the subnet mask and the router option are specified in a DHCP
78
+ # reply, the subnet mask option MUST be first.
79
+ #
80
+ # The code for the subnet mask option is 1, and its length is 4 octets.
81
+ #
82
+ # The default value for this option is 255.255.255.255
83
+ class SubnetMaskOption < Option
84
+ def initialize(params={})
85
+ params[:type] = $DHCP_SUBNETMASK
86
+ params[:payload] = params.fetch(:payload, [255, 255, 255, 255])
87
+ super(params)
88
+ end
89
+
90
+ def to_s()
91
+ "Subnet Mask = #{self.payload.join('.')}"
92
+ end
93
+ end
94
+
95
+
96
+ # The router option specifies a list of IP addresses for routers on the
97
+ # client's subnet. Routers SHOULD be listed in order of preference.
98
+ #
99
+ # The code for the router option is 3. The minimum length for the
100
+ # router option is 4 octets, and the length MUST always be a multiple
101
+ # of 4.
102
+ #
103
+ # The default value for this option is 0.0.0.0
104
+ class RouterOption < Option
105
+ def initialize(params={})
106
+ params[:type] = $DHCP_ROUTER
107
+ params[:payload] = params.fetch(:payload, [0, 0, 0, 0])
108
+ super(params)
109
+ end
110
+
111
+ def to_s()
112
+ "Router = #{self.payload.join('.')}"
113
+ end
114
+ end
115
+
116
+ # The domain name server option specifies a list of Domain Name System
117
+ # (STD 13, RFC 1035 [8]) name servers available to the client. Servers
118
+ # SHOULD be listed in order of preference.
119
+ #
120
+ # The code for the domain name server option is 6. The minimum length
121
+ # for this option is 4 octets, and the length MUST always be a multiple
122
+ # of 4.
123
+ #
124
+ # The default value for this option is 0.0.0.0
125
+ class DomainNameServerOption < Option
126
+ def initialize(params={})
127
+ params[:type] = $DHCP_DNS
128
+ params[:payload] = params.fetch(:payload, [0, 0, 0, 0])
129
+ super(params)
130
+ end
131
+
132
+ def to_s()
133
+ "Domain Name Server = #{self.payload.join('.')}"
134
+ end
135
+ end
136
+
137
+ # This option specifies the name of the client. The name may or may
138
+ # not be qualified with the local domain name (see section 3.17 for the
139
+ # preferred way to retrieve the domain name). See RFC 1035 for
140
+ # character set restrictions.
141
+ #
142
+ # The code for this option is 12, and its minimum length is 1.
143
+ #
144
+ # The default value for this option is 'caprica'
145
+ class HostNameOption < Option
146
+ def initialize(params={})
147
+ params[:type] = $DHCP_DNS
148
+ params[:payload] = params.fetch(:payload, 'caprica'.unpack('C*'))
149
+ super(params)
150
+ end
151
+
152
+ def to_s()
153
+ "Host Name = #{self.payload.pack('C*')}"
154
+ end
155
+ end
156
+
157
+ # This option specifies the domain name that client should use when
158
+ # resolving hostnames via the Domain Name System.
159
+ #
160
+ # The code for this option is 15. Its minimum length is 1.
161
+ #
162
+ # The default value for this option is "nomejortu.com"
163
+ class DomainNameOption < Option
164
+ def initialize(params={})
165
+ params[:type] = $DHCP_DOMAINNAME
166
+ params[:payload] = params.fetch(:payload, 'nomejortu.com'.unpack('C*'))
167
+ super(params)
168
+ end
169
+
170
+ def to_s()
171
+ "Domain Name = #{self.payload.pack('C*')}"
172
+ end
173
+ end
174
+
175
+ # This option is used in a client request (DHCPDISCOVER) to allow the
176
+ # client to request that a particular IP address be assigned.
177
+ #
178
+ # The code for this option is 50, and its length is 4.
179
+ #
180
+ # The default value for this option is 0.0.0.0
181
+ class RequestedIPAddressOption < Option
182
+ def initialize(params={})
183
+ params[:type] = $DHCP_DISCOVERADDR
184
+ params[:payload] = params.fetch(:payload, [0, 0, 0, 0])
185
+ super(params)
186
+ end
187
+
188
+ def to_s
189
+ "Requested IP address = #{self.payload.join('.')}"
190
+ end
191
+ end
192
+
193
+ # This option is used in a client request (DHCPDISCOVER or DHCPREQUEST)
194
+ # to allow the client to request a lease time for the IP address. In a
195
+ # server reply (DHCPOFFER), a DHCP server uses this option to specify
196
+ # the lease time it is willing to offer.
197
+ #
198
+ # The time is in units of seconds, and is specified as a 32-bit
199
+ # unsigned integer.
200
+ #
201
+ # The code for this option is 51, and its length is 4.
202
+ #
203
+ # The default value is 7200 (2h)
204
+ class IPAddressLeaseTimeOption < Option
205
+ def initialize(params={})
206
+ params[:type] = $DHCP_LEASETIME
207
+ params[:payload] = params.fetch(:payload, [7200].pack('N').unpack('C*'))
208
+ super(params)
209
+ end
210
+
211
+ def to_s()
212
+ "IP Address Lease Time = #{self.payload.pack('C*').unpack('N').first} seg"
213
+ end
214
+ end
215
+
216
+ # This option is used to convey the type of the DHCP message. The code
217
+ # for this option is 53, and its length is 1. Legal values for this
218
+ # option are:
219
+ #
220
+ # Value Message Type
221
+ # ----- ------------
222
+ # 1 DHCPDISCOVER
223
+ # 2 DHCPOFFER
224
+ # 3 DHCPREQUEST
225
+ # 4 DHCPDECLINE
226
+ # 5 DHCPACK
227
+ # 6 DHCPNAK
228
+ # 7 DHCPRELEASE
229
+ # 8 DHCPINFORM
230
+ #
231
+ # The default value is 1 (DHCPDISCOVER)
232
+ class MessageTypeOption < Option
233
+ def initialize(params={})
234
+ params[:type] = $DHCP_MESSAGETYPE
235
+ params[:payload] = params.fetch(:payload, [$DHCP_MSG_DISCOVER])
236
+ super(params)
237
+ end
238
+
239
+ def to_s
240
+ "DHCP Message Type = #{$DHCP_MSG_NAMES[self.payload[0]-1]} (#{self.payload[0]})"
241
+ end
242
+ end
243
+
244
+
245
+ # This option is used in DHCPOFFER and DHCPREQUEST messages, and may
246
+ # optionally be included in the DHCPACK and DHCPNAK messages. DHCP
247
+ # servers include this option in the DHCPOFFER in order to allow the
248
+ # client to distinguish between lease offers. DHCP clients use the
249
+ # contents of the 'server identifier' field as the destination address
250
+ # for any DHCP messages unicast to the DHCP server. DHCP clients also
251
+ # indicate which of several lease offers is being accepted by including
252
+ # this option in a DHCPREQUEST message.
253
+ #
254
+ # The identifier is the IP address of the selected server.
255
+ #
256
+ # The code for this option is 54, and its length is 4.
257
+ #
258
+ # The default value is 0.0.0.0
259
+ class ServerIdentifierOption < Option
260
+ def initialize(params={})
261
+ params[:type] = $DHCP_SERVIDENT
262
+ params[:payload] = params.fetch(:payload, [0, 0, 0, 0])
263
+ super(params)
264
+ end
265
+
266
+ def to_s
267
+ "Server Identifier = #{self.payload.join('.')}"
268
+ end
269
+ end
270
+
271
+ # This option is used by a DHCP client to request values for specified
272
+ # configuration parameters. The list of requested parameters is
273
+ # specified as n octets, where each octet is a valid DHCP option code
274
+ # as defined in this document.
275
+ #
276
+ # The client MAY list the options in order of preference. The DHCP
277
+ # server is not required to return the options in the requested order,
278
+ # but MUST try to insert the requested options in the order requested
279
+ # by the client.
280
+ #
281
+ # The code for this option is 55. Its minimum length is 1.
282
+ #
283
+ # The default value is: $DHCP_SUBNETMASK | $DHCP_ROUTER | $DHCP_DNS | $DHCP_DOMAINNAME
284
+ class ParameterRequestListOption < Option
285
+ def initialize(params={})
286
+ params[:type] = $DHCP_PARAMREQUEST
287
+ params[:payload] = params.fetch(:payload, [$DHCP_SUBNETMASK, $DHCP_ROUTER, $DHCP_DNS, $DHCP_DOMAINNAME])
288
+ super(params)
289
+ end
290
+
291
+ def to_s
292
+ "Parameter Request List = #{self.payload}"
293
+ end
294
+ end
295
+
296
+ # This option is used by DHCP clients to optionally identify the vendor
297
+ # type and configuration of a DHCP client. The information is a string
298
+ # of n octets, interpreted by servers. Vendors may choose to define
299
+ # specific vendor class identifiers to convey particular configuration
300
+ # or other identification information about a client. For example, the
301
+ # identifier may encode the client's hardware configuration. Servers
302
+ # not equipped to interpret the class-specific information sent by a
303
+ # client MUST ignore it (although it may be reported). Servers that
304
+ #
305
+ # respond SHOULD only use option 43 to return the vendor-specific
306
+ # information to the client.
307
+ #
308
+ # The code for this option is 60, and its minimum length is 1.
309
+ #
310
+ # The default value is: 'etdsoft'
311
+ class VendorClassIDOption < Option
312
+ def initialize(params={})
313
+ params[:type] = $DHCP_CLASSSID
314
+ params[:payload] = params.fetch(:payload, 'etdsoft'.unpack('C*'))
315
+ super(params)
316
+ end
317
+
318
+ def to_s()
319
+ "Vendor class identifier = #{self.payload.pack('C*')}"
320
+ end
321
+ end
322
+
323
+
324
+ # This option is used by DHCP clients to specify their unique
325
+ # identifier. DHCP servers use this value to index their database of
326
+ # address bindings. This value is expected to be unique for all
327
+ # clients in an administrative domain.
328
+ #
329
+ # Identifiers SHOULD be treated as opaque objects by DHCP servers.
330
+ #
331
+ # The client identifier MAY consist of type-value pairs similar to the
332
+ # 'htype'/'chaddr' fields defined in [3]. For instance, it MAY consist
333
+ # of a hardware type and hardware address. In this case the type field
334
+ # SHOULD be one of the ARP hardware types defined in STD2 [22]. A
335
+ # hardware type of 0 (zero) should be used when the value field
336
+ # contains an identifier other than a hardware address (e.g. a fully
337
+ # qualified domain name).
338
+ #
339
+ # For correct identification of clients, each client's client-
340
+ # identifier MUST be unique among the client-identifiers used on the
341
+ # subnet to which the client is attached. Vendors and system
342
+ # administrators are responsible for choosing client-identifiers that
343
+ # meet this requirement for uniqueness.
344
+ #
345
+ # The code for this option is 61, and its minimum length is 2.
346
+ #
347
+ # The default value is: 0x6969
348
+ class ClientIdentifierOption < Option
349
+ def initialize(params={})
350
+ params[:type] = $DHCP_CLIENTID
351
+ params[:payload] = params.fetch(:payload, [0x69, 0x69])
352
+ super(params)
353
+ end
354
+
355
+ def to_s
356
+ "Client Identifier = #{self.payload}"
357
+ end
358
+ end
359
+
360
+ # Option that can be used to exchange information about a
361
+ # DHCPv4 client's fully qualified domain name and about responsibility
362
+ # for updating the DNS RR related to the client's address assignment.
363
+ #
364
+ # See rfc4702 for full details
365
+ #
366
+ # The code for this option is 81, and its minimun length is 3.
367
+ #
368
+ # The default payload for this option is 'etd'
369
+ class ClientFQDNOption < Option
370
+ def initialize(params={})
371
+ params[:type] = $DHCP_CLIENTFQDN
372
+ params[:payload] = params.fetch(:payload, 'etd'.unpack('C*'))
373
+ super(params)
374
+ end
375
+
376
+ def to_s
377
+ "Client Fully Qualified Domain Name = #{self.payload.pack('C*')}"
378
+ end
379
+ end
380
+
381
+ # Octet "n" gives the number of octets containing "architecture types"
382
+ # (not including the code and len fields). It MUST be an even number
383
+ # greater than zero. Clients that support more than one architecture
384
+ # type MAY include a list of these types in their initial DHCP and PXE
385
+ # boot server packets. The list of supported architecture types MAY be
386
+ # reduced in any packet exchange between the client and server(s).
387
+ # Octets "n1" and "n2" encode a 16-bit architecture type identifier
388
+ # that describes the pre-boot runtime environment(s) of the client
389
+ # machine.
390
+ #
391
+ # See rfc4578 for full details
392
+ #
393
+ # The code for this option is 93, and its length must be an even number
394
+ # greater than zero.
395
+ #
396
+ # The default payload for this option is $DHCP_CLIENTARCH_I386
397
+ class ClientSystemArchitectureOption < Option
398
+ def initialize(params={})
399
+ params[:type] = $DHCP_CLIENTARCH
400
+ params[:payload] = params.fetch(:payload, [$DHCP_CLIENTARCH_I386].pack('n').unpack('C*'))
401
+ super(params)
402
+ end
403
+ def to_s
404
+ arch_id = self.payload.pack('C*').unpack('n').first
405
+ if (arch_id > ($DHCP_CLIENTARCH_NAMES.size-1))
406
+ arch = 'unknown'
407
+ else
408
+ arch = $DHCP_CLIENTARCH_NAMES[arch_id]
409
+ end
410
+
411
+ "Client System Architecture = #{arch}"
412
+ end
413
+ end
414
+
415
+ # Octet "t" encodes a network interface type. For now the only
416
+ # supported value is 1 for Universal Network Device Interface (UNDI).
417
+ # Octets "M" and "m" describe the interface revision. To encode the
418
+ # UNDI revision of 2.11, "M" would be set to 2, and "m" would be set to
419
+ # 11 (0x0B).
420
+ #
421
+ # See rfc4578 for full details
422
+ #
423
+ # The code for this option is 94, and its length is 3.
424
+ #
425
+ # The default payload for this option is 0,0x69,0x69
426
+ class ClientNetworkDeviceInterfaceOption < Option
427
+ def initialize(params={})
428
+ params[:type] = $DHCP_CLIENTNDI
429
+ params[:payload] = params.fetch(:payload, [0]+[0x69]*2)
430
+ super(params)
431
+ end
432
+ def to_s
433
+ uuid = self.payload.pack('n').unpack('C*')
434
+ "Client Network Device Interface = #{uuid}"
435
+ end
436
+ end
437
+
438
+ # Octet "t" describes the type of the machine identifier in the
439
+ # remaining octets in this option. 0 (zero) is the only value defined
440
+ # for this octet at the present time, and it describes the remaining
441
+ # octets as a 16-octet Globally Unique Identifier (GUID). Octet "n" is
442
+ # 17 for type 0. (One definition of GUID can be found in Appendix A of
443
+ # the EFI specification [4].)
444
+ #
445
+ # See rfc4578 for full details
446
+ #
447
+ # The code for this option is 97, and its length is 17: 1 for the type of
448
+ # identifier and 16 for a Globally Unique Identifier.
449
+ #
450
+ # The default payload for this option is 0, [0x69]*16
451
+ class UUIDGUIDOption < Option
452
+ def initialize(params={})
453
+ params[:type] = $DHCP_UUIDGUID
454
+ params[:payload] = params.fetch(:payload, [0]+[0x69]*16)
455
+ super(params)
456
+ end
457
+ def to_s
458
+ "UUID/GUID Client Identifier = #{self.payload}"
459
+ end
460
+ end
461
+
462
+
463
+ # from rfc2132:
464
+ # This option specifies the maximum length DHCP message that it is
465
+ # willing to accept. The length is specified as an unsigned 16-bit
466
+ # integer. A client may use the maximum DHCP message size option in
467
+ # DHCPDISCOVER or DHCPREQUEST messages, but should not use the option
468
+ # in DHCPDECLINE messages.
469
+ class MaximumMsgSizeOption < Option
470
+ def initialize(params={})
471
+ params[:type] = $DHCP_MAXMSGSIZE
472
+ params[:payload] = params.fetch(:payload, [1024].pack('n').unpack('C*'))
473
+ super(params)
474
+ end
475
+
476
+ def to_s
477
+ "Maximum Message Size = #{self.payload}"
478
+ end
479
+ end
480
+
481
+ # see: rfc3004
482
+ class UserClassInformationOption < Option
483
+ def initialize(params={})
484
+ params[:type] = $DHCP_USERCLASS
485
+ params[:payload] = params.fetch(:payload, [0x67, 0x50, 0x58, 0x45] )
486
+ super(params)
487
+ end
488
+
489
+ def to_s
490
+ "UserClassInformation = #{self.payload}"
491
+ end
492
+ end
493
+
494
+ class PrivateOption < Option
495
+ def initialize(params={})
496
+ params[:type] = params.fetch(:private_type_num, $DHCP_PRIVATE)
497
+ params[:payload] = params.fetch(:payload, [0x00] )
498
+ super(params)
499
+ end
500
+
501
+ def to_s
502
+ "Private = #{self.payload}"
503
+ end
504
+ end
505
+
506
+ # Operating Systems are now attempting to support ad-hoc networks of
507
+ # two or more systems, while keeping user configuration at a minimum.
508
+ # To accommodate this, in the absence of a central configuration
509
+ # mechanism (DHCP), some OS's are automatically choosing a link-local
510
+ # IP address which will allow them to communicate only with other hosts
511
+ # on the same link. This address will not allow the OS to communicate
512
+ # with anything beyond a router. However, some sites depend on the
513
+ # fact that a host with no DHCP response will have no IP address. This
514
+ # document describes a mechanism by which DHCP servers are able to tell
515
+ # clients that they do not have an IP address to offer, and that the
516
+ # client should not generate an IP address it's own.
517
+ #
518
+ # See rfc2563 for full details
519
+ #
520
+ # The code for this option is 116, and its length is 1.
521
+ #
522
+ # The default payload for this option is $DHCP_AUTOCONF_YES
523
+ class AutoConfigurationOption < Option
524
+ def initialize(params={})
525
+ params[:type] = $DHCP_AUTOCONF
526
+ params[:payload] = params.fetch(:payload, [$DHCP_AUTOCONF_YES])
527
+ super(params)
528
+ end
529
+
530
+ def to_s
531
+ "DHCP Auto-Configuration = #{self.payload == $DHCP_AUTOCONF_YES ? 'Yes' : 'No' }"
532
+ end
533
+ end
534
+
535
+ $DHCP_MSG_OPTIONS = {
536
+ $DHCP_SUBNETMASK => SubnetMaskOption,
537
+ $DHCP_TIMEOFFSET => Option,
538
+ $DHCP_ROUTER => RouterOption,
539
+ $DHCP_TIMESERVER => Option,
540
+ $DHCP_NAMESERVER => Option,
541
+ $DHCP_DNS => DomainNameServerOption,
542
+ $DHCP_LOGSERV => Option,
543
+ $DHCP_COOKIESERV => Option,
544
+ $DHCP_QUOTESSERV => Option,
545
+ $DHCP_LPRSERV => Option,
546
+ $DHCP_IMPSERV => Option,
547
+ $DHCP_RESSERV => Option,
548
+ $DHCP_HOSTNAME => HostNameOption,
549
+ $DHCP_BOOTFILESIZE => Option,
550
+ $DHCP_DUMPFILE => Option,
551
+ $DHCP_DOMAINNAME => DomainNameOption,
552
+ $DHCP_SWAPSERV => Option,
553
+ $DHCP_ROOTPATH => Option,
554
+ $DHCP_EXTENPATH => Option,
555
+ $DHCP_IPFORWARD => Option,
556
+ $DHCP_SRCROUTE => Option,
557
+ $DHCP_POLICYFILTER => Option,
558
+ $DHCP_MAXASMSIZE => Option,
559
+ $DHCP_IPTTL => Option,
560
+ $DHCP_MTUTIMEOUT => Option,
561
+ $DHCP_MTUTABLE => Option,
562
+ $DHCP_MTUSIZE => Option,
563
+ $DHCP_LOCALSUBNETS => Option,
564
+ $DHCP_BROADCASTADDR => Option,
565
+ $DHCP_DOMASKDISCOV => Option,
566
+ $DHCP_MASKSUPPLY => Option,
567
+ $DHCP_DOROUTEDISC => Option,
568
+ $DHCP_ROUTERSOLICIT => Option,
569
+ $DHCP_STATICROUTE => Option,
570
+ $DHCP_TRAILERENCAP => Option,
571
+ $DHCP_ARPTIMEOUT => Option,
572
+ $DHCP_ETHERENCAP => Option,
573
+ $DHCP_TCPTTL => Option,
574
+ $DHCP_TCPKEEPALIVE => Option,
575
+ $DHCP_TCPALIVEGARBAGE => Option,
576
+ $DHCP_NISDOMAIN => Option,
577
+ $DHCP_NISSERVERS => Option,
578
+ $DHCP_NISTIMESERV => Option,
579
+ $DHCP_VENDSPECIFIC => Option,
580
+ $DHCP_NBNS => Option,
581
+ $DHCP_NBDD => Option,
582
+ $DHCP_NBTCPIP => Option,
583
+ $DHCP_NBTCPSCOPE => Option,
584
+ $DHCP_XFONT => Option,
585
+ $DHCP_XDISPLAYMGR => Option,
586
+ $DHCP_DISCOVERADDR => RequestedIPAddressOption,
587
+ $DHCP_LEASETIME => IPAddressLeaseTimeOption,
588
+ $DHCP_OPTIONOVERLOAD => Option,
589
+ $DHCP_MESSAGETYPE => MessageTypeOption,
590
+ $DHCP_SERVIDENT => ServerIdentifierOption,
591
+ $DHCP_PARAMREQUEST => ParameterRequestListOption,
592
+ $DHCP_MESSAGE => Option,
593
+ $DHCP_MAXMSGSIZE => MaximumMsgSizeOption,
594
+ $DHCP_RENEWTIME => Option,
595
+ $DHCP_REBINDTIME => Option,
596
+ $DHCP_CLASSSID => VendorClassIDOption,
597
+ $DHCP_CLIENTID => ClientIdentifierOption,
598
+ $DHCP_NISPLUSDOMAIN => Option,
599
+ $DHCP_NISPLUSSERVERS => Option,
600
+ $DHCP_MOBILEIPAGENT => Option,
601
+ $DHCP_SMTPSERVER => Option,
602
+ $DHCP_POP3SERVER => Option,
603
+ $DHCP_NNTPSERVER => Option,
604
+ $DHCP_WWWSERVER => Option,
605
+ $DHCP_FINGERSERVER => Option,
606
+ $DHCP_IRCSERVER => Option,
607
+ $DHCP_STSERVER => Option,
608
+ $DHCP_STDASERVER => Option,
609
+ $DHCP_USERCLASS => UserClassInformationOption,
610
+ $DHCP_PRIVATE => PrivateOption,
611
+
612
+ $DHCP_CLIENTFQDN => ClientFQDNOption,
613
+ $DHCP_CLIENTARCH => ClientSystemArchitectureOption,
614
+ $DHCP_CLIENTNDI => ClientNetworkDeviceInterfaceOption,
615
+ $DHCP_LDAP => Option,
616
+ $DHCP_UUIDGUID => UUIDGUIDOption,
617
+ $DHCP_AUTOCONF => AutoConfigurationOption,
618
+
619
+ }
620
+
621
+ end