--- /dev/null
+# Net::DHCP::Constants.pm
+# Author: Stephan Hadinger
+
+package Net::DHCP::Constants;
+
+# standard module declaration
+use 5.8.0;
+use strict;
+our (@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
+use Exporter;
+$VERSION = 0.66;
+@ISA = qw(Exporter);
+
+@EXPORT = qw(MAGIC_COOKIE);
+
+# Constants
+our (%DHO_CODES, %REV_DHO_CODES);
+our (%DHCP_MESSAGE, %REV_DHCP_MESSAGE);
+our (%BOOTP_CODES, %REV_BOOTP_CODES);
+our (%HTYPE_CODES, %REV_HTYPE_CODES);
+
+%EXPORT_TAGS = (
+ dho_codes => [keys %DHO_CODES],
+ dhcp_message => [keys %DHCP_MESSAGE],
+ bootp_codes => [keys %BOOTP_CODES],
+ htype_codes => [keys %HTYPE_CODES],
+ dhcp_hashes => [ qw(
+ %DHO_CODES %REV_DHO_CODES %DHCP_MESSAGE %REV_DHCP_MESSAGE
+ %BOOTP_CODES %REV_BOOTP_CODES
+ %HTYPE_CODES %REV_HTYPE_CODES
+ )],
+ dhcp_other => [ qw(MAGIC_COOKIE DHCP_UDP_OVERHEAD DHCP_MAX_MTU BOOTP_MIN_LEN BOOTP_ABSOLUTE_MIN_LEN DHCP_MIN_LEN)]
+ );
+
+@EXPORT_OK = qw(
+ %DHO_CODES %REV_DHO_CODES %DHCP_MESSAGE %REV_DHCP_MESSAGE
+ %BOOTP_CODES %REV_BOOTP_CODES
+ %HTYPE_CODES %REV_HTYPE_CODES
+ %DHO_FORMATS
+ );
+Exporter::export_tags('dho_codes');
+Exporter::export_tags('dhcp_message');
+Exporter::export_tags('bootp_codes');
+Exporter::export_tags('htype_codes');
+Exporter::export_ok_tags('dhcp_other');
+
+# MAGIC_COOKIE for DHCP (oterhwise it is BOOTP)
+use constant MAGIC_COOKIE => "\x63\x82\x53\x63";
+
+use constant DHCP_UDP_OVERHEAD => (14 + 20 + 8); # Ethernet + IP + UDP
+use constant DHCP_MAX_MTU => 1500;
+use constant BOOTP_ABSOLUTE_MIN_LEN => 236;
+use constant BOOTP_MIN_LEN => 300;
+use constant DHCP_MIN_LEN => 548;
+
+BEGIN {
+ %BOOTP_CODES = (
+ 'BOOTREQUEST' => 1,
+ 'BOOTREPLY' => 2
+ );
+
+ %HTYPE_CODES = (
+ 'HTYPE_ETHER' => 1,
+ 'HTYPE_IEEE802' => 6,
+ 'HTYPE_FDDI' => 8
+ );
+
+ %DHO_CODES = ( # rfc 2132
+ 'DHO_PAD' => 0,
+ 'DHO_SUBNET_MASK' => 1,
+ 'DHO_TIME_OFFSET' => 2,
+ 'DHO_ROUTERS' => 3,
+ 'DHO_TIME_SERVERS' => 4,
+ 'DHO_NAME_SERVERS' => 5,
+ 'DHO_DOMAIN_NAME_SERVERS' => 6,
+ 'DHO_LOG_SERVERS' => 7,
+ 'DHO_COOKIE_SERVERS' => 8,
+ 'DHO_LPR_SERVERS' => 9,
+ 'DHO_IMPRESS_SERVERS' => 10,
+ 'DHO_RESOURCE_LOCATION_SERVERS' => 11,
+ 'DHO_HOST_NAME' => 12,
+ 'DHO_BOOT_SIZE' => 13,
+ 'DHO_MERIT_DUMP' => 14,
+ 'DHO_DOMAIN_NAME' => 15,
+ 'DHO_SWAP_SERVER' => 16,
+ 'DHO_ROOT_PATH' => 17,
+ 'DHO_EXTENSIONS_PATH' => 18,
+ 'DHO_IP_FORWARDING' => 19,
+ 'DHO_NON_LOCAL_SOURCE_ROUTING' => 20,
+ 'DHO_POLICY_FILTER' => 21,
+ 'DHO_MAX_DGRAM_REASSEMBLY' => 22,
+ 'DHO_DEFAULT_IP_TTL' => 23,
+ 'DHO_PATH_MTU_AGING_TIMEOUT' => 24,
+ 'DHO_PATH_MTU_PLATEAU_TABLE' => 25,
+ 'DHO_INTERFACE_MTU' => 26,
+ 'DHO_ALL_SUBNETS_LOCAL' => 27,
+ 'DHO_BROADCAST_ADDRESS' => 28,
+ 'DHO_PERFORM_MASK_DISCOVERY' => 29,
+ 'DHO_MASK_SUPPLIER' => 30,
+ 'DHO_ROUTER_DISCOVERY' => 31,
+ 'DHO_ROUTER_SOLICITATION_ADDRESS' => 32,
+ 'DHO_STATIC_ROUTES' => 33,
+ 'DHO_TRAILER_ENCAPSULATION' => 34,
+ 'DHO_ARP_CACHE_TIMEOUT' => 35,
+ 'DHO_IEEE802_3_ENCAPSULATION' => 36,
+ 'DHO_DEFAULT_TCP_TTL' => 37,
+ 'DHO_TCP_KEEPALIVE_INTERVAL' => 38,
+ 'DHO_TCP_KEEPALIVE_GARBAGE' => 39,
+ 'DHO_NIS_DOMAIN' => 40,
+ 'DHO_NIS_SERVERS' => 41,
+ 'DHO_NTP_SERVERS' => 42,
+ 'DHO_VENDOR_ENCAPSULATED_OPTIONS' => 43,
+ 'DHO_NETBIOS_NAME_SERVERS' => 44,
+ 'DHO_NETBIOS_DD_SERVER' => 45,
+ 'DHO_NETBIOS_NODE_TYPE' => 46,
+ 'DHO_NETBIOS_SCOPE' => 47,
+ 'DHO_FONT_SERVERS' => 48,
+ 'DHO_X_DISPLAY_MANAGER' => 49,
+ 'DHO_DHCP_REQUESTED_ADDRESS' => 50,
+ 'DHO_DHCP_LEASE_TIME' => 51,
+ 'DHO_DHCP_OPTION_OVERLOAD' => 52,
+ 'DHO_DHCP_MESSAGE_TYPE' => 53,
+ 'DHO_DHCP_SERVER_IDENTIFIER' => 54,
+ 'DHO_DHCP_PARAMETER_REQUEST_LIST' => 55,
+ 'DHO_DHCP_MESSAGE' => 56,
+ 'DHO_DHCP_MAX_MESSAGE_SIZE' => 57,
+ 'DHO_DHCP_RENEWAL_TIME' => 58,
+ 'DHO_DHCP_REBINDING_TIME' => 59,
+ 'DHO_VENDOR_CLASS_IDENTIFIER' => 60,
+ 'DHO_DHCP_CLIENT_IDENTIFIER' => 61,
+ 'DHO_NWIP_DOMAIN_NAME' => 62,
+ 'DHO_NWIP_SUBOPTIONS' => 63,
+ 'DHO_NIS_DOMAIN' => 64,
+ 'DHO_NIS_SERVER' => 65,
+ 'DHO_TFTP_SERVER' => 66,
+ 'DHO_BOOTFILE' => 67,
+ 'DHO_MOBILE_IP_HOME_AGENT' => 68,
+ 'DHO_SMTP_SERVER' => 69,
+ 'DHO_POP3_SERVER' => 70,
+ 'DHO_NNTP_SERVER' => 71,
+ 'DHO_WWW_SERVER' => 72,
+ 'DHO_FINGER_SERVER' => 73,
+ 'DHO_IRC_SERVER' => 74,
+ 'DHO_STREETTALK_SERVER' => 75,
+ 'DHO_STDA_SERVER' => 76,
+ 'DHO_USER_CLASS' => 77,
+ 'DHO_FQDN' => 81,
+ 'DHO_DHCP_AGENT_OPTIONS' => 82,
+ 'DHO_NDS_SERVERS' => 85,
+ 'DHO_NDS_TREE_NAME' => 86,
+ 'DHO_USER_AUTHENTICATION_PROTOCOL' => 98,
+ 'DHO_AUTO_CONFIGURE' => 116,
+ 'DHO_NAME_SERVICE_SEARCH' => 117,
+ 'DHO_SUBNET_SELECTION' => 118,
+
+ 'DHO_END' => 255
+ );
+
+ %DHCP_MESSAGE = (
+ 'DHCPDISCOVER' => 1,
+ 'DHCPOFFER' => 2,
+ 'DHCPREQUEST' => 3,
+ 'DHCPDECLINE' => 4,
+ 'DHCPACK' => 5,
+ 'DHCPNAK' => 6,
+ 'DHCPRELEASE' => 7,
+ 'DHCPINFORM' => 8,
+ 'DHCPFORCERENEW' => 9,
+
+ 'DHCPLEASEQUERY' => 13, # Cisco extension, draft-ietf-dhc-leasequery-08.txt
+ );
+}
+
+ use constant \%DHO_CODES;
+ %REV_DHO_CODES = reverse %DHO_CODES;
+
+ use constant \%DHCP_MESSAGE;
+ %REV_DHCP_MESSAGE = reverse %DHCP_MESSAGE;
+
+ use constant \%BOOTP_CODES;
+ %REV_BOOTP_CODES = reverse %BOOTP_CODES; # for reverse lookup
+
+ use constant \%HTYPE_CODES;
+ %REV_HTYPE_CODES = reverse %HTYPE_CODES; # for reverse lookup
+
+#
+# Format of DHCP options : for pretty-printing
+# void : no parameter
+# inet : 4 bytes IP address
+# inets : list of 4 bytess IP addresses
+# inets2 : liste of 4 bytes IP addresses pairs (multiple of 8 bytes)
+# int : 4 bytes integer
+# short : 2 bytes intteger
+# shorts : list of 2 bytes integers
+# byte : 1 byte int
+# bytes : list of 1 byte code
+# string : char* (just kidding)
+# relays : DHCP sub-options (rfc 3046)
+# id : client identifier : byte (htype) + string (chaddr)
+#
+our %DHO_FORMATS = (
+ DHO_PAD() => 'void',
+ DHO_SUBNET_MASK() => 'inet',
+ DHO_TIME_OFFSET() => 'int',
+ DHO_ROUTERS() => 'inets',
+ DHO_TIME_SERVERS() => 'inets',
+ DHO_NAME_SERVERS() => 'inets',
+ DHO_DOMAIN_NAME_SERVERS() => 'inets',
+ DHO_LOG_SERVERS() => 'inets',
+ DHO_COOKIE_SERVERS() => 'inets',
+ DHO_LPR_SERVERS() => 'inets',
+ DHO_IMPRESS_SERVERS() => 'inets',
+ DHO_RESOURCE_LOCATION_SERVERS() => 'inets',
+ DHO_HOST_NAME() => 'string',
+ DHO_BOOT_SIZE() => 'short',
+ DHO_MERIT_DUMP() => 'string',
+ DHO_DOMAIN_NAME() => 'string',
+ DHO_SWAP_SERVER() => 'inet',
+ DHO_ROOT_PATH() => 'string',
+ DHO_EXTENSIONS_PATH() => 'string',
+ DHO_IP_FORWARDING() => 'byte',
+ DHO_NON_LOCAL_SOURCE_ROUTING() => 'byte',
+ DHO_POLICY_FILTER() => 'inets2',
+ DHO_MAX_DGRAM_REASSEMBLY() => 'short',
+ DHO_DEFAULT_IP_TTL() => 'byte',
+ DHO_PATH_MTU_AGING_TIMEOUT() => 'int',
+ DHO_PATH_MTU_PLATEAU_TABLE() => 'shorts',
+ DHO_INTERFACE_MTU() => 'short',
+ DHO_ALL_SUBNETS_LOCAL() => 'byte',
+ DHO_BROADCAST_ADDRESS() => 'inet',
+ DHO_PERFORM_MASK_DISCOVERY() => 'byte',
+ DHO_MASK_SUPPLIER() => 'byte',
+ DHO_ROUTER_DISCOVERY() => 'byte',
+ DHO_ROUTER_SOLICITATION_ADDRESS() => 'inet',
+ DHO_STATIC_ROUTES() => 'inets2',
+ DHO_TRAILER_ENCAPSULATION() => 'byte',
+ DHO_ARP_CACHE_TIMEOUT() => 'int',
+ DHO_IEEE802_3_ENCAPSULATION() => 'byte',
+ DHO_DEFAULT_TCP_TTL() => 'byte',
+ DHO_TCP_KEEPALIVE_INTERVAL() => 'int',
+ DHO_TCP_KEEPALIVE_GARBAGE() => 'byte',
+ DHO_NIS_DOMAIN() => 'string',
+ DHO_NIS_SERVERS() => 'inets',
+ DHO_NTP_SERVERS() => 'inets',
+# DHO_VENDOR_ENCAPSULATED_OPTIONS() => '',
+ DHO_NETBIOS_NAME_SERVERS() => 'inets',
+ DHO_NETBIOS_DD_SERVER() => 'inets',
+ DHO_NETBIOS_NODE_TYPE() => 'byte',
+ DHO_NETBIOS_SCOPE() => 'string',
+ DHO_FONT_SERVERS() => 'inets',
+ DHO_X_DISPLAY_MANAGER() => 'inets',
+ DHO_DHCP_REQUESTED_ADDRESS() => 'inet',
+ DHO_DHCP_LEASE_TIME() => 'int',
+ DHO_DHCP_OPTION_OVERLOAD() => 'byte',
+ DHO_DHCP_MESSAGE_TYPE() => 'byte',
+ DHO_DHCP_SERVER_IDENTIFIER() => 'inet',
+ DHO_DHCP_PARAMETER_REQUEST_LIST() => 'bytes',
+ DHO_DHCP_MESSAGE() => 'string',
+ DHO_DHCP_MAX_MESSAGE_SIZE() => 'short',
+ DHO_DHCP_RENEWAL_TIME() => 'int',
+ DHO_DHCP_REBINDING_TIME() => 'int',
+ DHO_VENDOR_CLASS_IDENTIFIER() => 'string',
+# DHO_DHCP_CLIENT_IDENTIFIER() => 'ids',
+ DHO_NWIP_DOMAIN_NAME() => 'string', # rfc 2242
+# DHO_NWIP_SUBOPTIONS() => '', # rfc 2242
+ DHO_NIS_DOMAIN() => 'string',
+ DHO_NIS_SERVER() => 'string',
+ DHO_TFTP_SERVER() => 'string',
+ DHO_BOOTFILE() => 'string',
+ DHO_MOBILE_IP_HOME_AGENT() => 'inets',
+ DHO_SMTP_SERVER() => 'inets',
+ DHO_POP3_SERVER() => 'inets',
+ DHO_NNTP_SERVER() => 'inets',
+ DHO_WWW_SERVER() => 'inets',
+ DHO_FINGER_SERVER() => 'inets',
+ DHO_IRC_SERVER() => 'inets',
+ DHO_STREETTALK_SERVER() => 'inets',
+ DHO_STDA_SERVER() => 'inets',
+# DHO_USER_CLASS() => '', # rfc 3004
+# DHO_FQDN() => '', # draft-ietf-dhc-fqdn-option-10.txt
+# DHO_DHCP_AGENT_OPTIONS() => 'relays', # rfc 3046
+ DHO_NDS_SERVERS() => 'inets', # rfc 2241
+ DHO_NDS_TREE_NAME() => 'string', # rfc 2241
+ DHO_USER_AUTHENTICATION_PROTOCOL() => 'string', # rfc 2485
+ DHO_AUTO_CONFIGURE() => 'byte', # rfc 2563
+ DHO_NAME_SERVICE_SEARCH() => 'shorts', # rfc 2937
+ DHO_SUBNET_SELECTION() => 'inet', # rfc 3011
+
+ );
+
+1;
+
+=pod
+
+=head1 NAME
+
+Net::DHCP::Constants - Constants for DHCP codes and options
+
+=head1 SYNOPSIS
+
+ use Net::DHCP::Constants;
+ print "DHCP option SUBNET_MASK is ", DHO_SUBNET_MASK();
+
+=head1 DESCRIPTION
+
+Represents constants used in DHCP protocol, defined in RFC 1533, RFC 2132,
+RFC 2241, RFC 2485, RFC 2563, RFC 2937, RFC 3004, RFC 3011, RFC 3046.
+
+=head1 TAGS
+
+As mentioned above, constants can either be imported individually
+or in sets grouped by tag names. The tag names are:
+
+=over 4
+
+=item * bootp_codes
+
+Imports all of the basic I<BOOTP> constants.
+
+ (01) BOOTREQUEST
+ (02) BOOTREPLY
+
+=item * htype_codes
+
+Imports all I<HTYPE> (hardware address type) codes.
+
+ (01) HTYPE_ETHER
+ (06) HTYPE_IEEE802
+ (08) HTYPE_FDDI
+
+Most common value is HTYPE_ETHER for C<Ethernet>.
+
+=item * dhcp_message
+
+Import all DHCP Message codes.
+
+ (01) DHCPDISCOVER
+ (02) DHCPOFFER
+ (03) DHCPREQUEST
+ (04) DHCPDECLINE
+ (05) DHCPACK
+ (06) DHCPNAK
+ (07) DHCPRELEASE
+ (08) DHCPINFORM
+ (09) DHCPFORCERENEW
+ (13) DHCPLEASEQUERY # draft-ietf-dhc-leasequery-08.txt
+
+=item * dho_codes
+
+Import all DHCP option codes.
+
+ (000) DHO_PAD
+ (001) DHO_SUBNET_MASK
+ (002) DHO_TIME_OFFSET
+ (003) DHO_ROUTERS
+ (004) DHO_TIME_SERVERS
+ (005) DHO_NAME_SERVERS
+ (006) DHO_DOMAIN_NAME_SERVERS
+ (007) DHO_LOG_SERVERS
+ (008) DHO_COOKIE_SERVERS
+ (009) DHO_LPR_SERVERS
+ (010) DHO_IMPRESS_SERVERS
+ (011) DHO_RESOURCE_LOCATION_SERVERS
+ (012) DHO_HOST_NAME
+ (013) DHO_BOOT_SIZE
+ (014) DHO_MERIT_DUMP
+ (015) DHO_DOMAIN_NAME
+ (016) DHO_SWAP_SERVER
+ (017) DHO_ROOT_PATH
+ (018) DHO_EXTENSIONS_PATH
+ (019) DHO_IP_FORWARDING
+ (020) DHO_NON_LOCAL_SOURCE_ROUTING
+ (021) DHO_POLICY_FILTER
+ (022) DHO_MAX_DGRAM_REASSEMBLY
+ (023) DHO_DEFAULT_IP_TTL
+ (024) DHO_PATH_MTU_AGING_TIMEOUT
+ (025) DHO_PATH_MTU_PLATEAU_TABLE
+ (026) DHO_INTERFACE_MTU
+ (027) DHO_ALL_SUBNETS_LOCAL
+ (028) DHO_BROADCAST_ADDRESS
+ (029) DHO_PERFORM_MASK_DISCOVERY
+ (030) DHO_MASK_SUPPLIER
+ (031) DHO_ROUTER_DISCOVERY
+ (032) DHO_ROUTER_SOLICITATION_ADDRESS
+ (033) DHO_STATIC_ROUTES
+ (034) DHO_TRAILER_ENCAPSULATION
+ (035) DHO_ARP_CACHE_TIMEOUT
+ (036) DHO_IEEE802_3_ENCAPSULATION
+ (037) DHO_DEFAULT_TCP_TTL
+ (038) DHO_TCP_KEEPALIVE_INTERVAL
+ (039) DHO_TCP_KEEPALIVE_GARBAGE
+ (041) DHO_NIS_SERVERS
+ (042) DHO_NTP_SERVERS
+ (043) DHO_VENDOR_ENCAPSULATED_OPTIONS
+ (044) DHO_NETBIOS_NAME_SERVERS
+ (045) DHO_NETBIOS_DD_SERVER
+ (046) DHO_NETBIOS_NODE_TYPE
+ (047) DHO_NETBIOS_SCOPE
+ (048) DHO_FONT_SERVERS
+ (049) DHO_X_DISPLAY_MANAGER
+ (050) DHO_DHCP_REQUESTED_ADDRESS
+ (051) DHO_DHCP_LEASE_TIME
+ (052) DHO_DHCP_OPTION_OVERLOAD
+ (053) DHO_DHCP_MESSAGE_TYPE
+ (054) DHO_DHCP_SERVER_IDENTIFIER
+ (055) DHO_DHCP_PARAMETER_REQUEST_LIST
+ (056) DHO_DHCP_MESSAGE
+ (057) DHO_DHCP_MAX_MESSAGE_SIZE
+ (058) DHO_DHCP_RENEWAL_TIME
+ (059) DHO_DHCP_REBINDING_TIME
+ (060) DHO_VENDOR_CLASS_IDENTIFIER
+ (061) DHO_DHCP_CLIENT_IDENTIFIER
+ (062) DHO_NWIP_DOMAIN_NAME
+ (063) DHO_NWIP_SUBOPTIONS
+ (064) DHO_NIS_DOMAIN
+ (065) DHO_NIS_SERVER
+ (066) DHO_TFTP_SERVER
+ (067) DHO_BOOTFILE
+ (068) DHO_MOBILE_IP_HOME_AGENT
+ (069) DHO_SMTP_SERVER
+ (070) DHO_POP3_SERVER
+ (071) DHO_NNTP_SERVER
+ (072) DHO_WWW_SERVER
+ (073) DHO_FINGER_SERVER
+ (074) DHO_IRC_SERVER
+ (075) DHO_STREETTALK_SERVER
+ (076) DHO_STDA_SERVER
+ (077) DHO_USER_CLASS
+ (081) DHO_FQDN
+ (082) DHO_DHCP_AGENT_OPTIONS
+ (085) DHO_NDS_SERVERS
+ (086) DHO_NDS_TREE_NAME
+ (098) DHO_USER_AUTHENTICATION_PROTOCOL
+ (116) DHO_AUTO_CONFIGURE
+ (117) DHO_NAME_SERVICE_SEARCH
+ (118) DHO_SUBNET_SELECTION
+ (255) DHO_END
+
+=back
+
+=head1 TO DO, LIMITATIONS
+
+Automatic parsing of DHO_VENDOR_ENCAPSULATED_OPTIONS (code 43) is unsupported.
+
+Automatic parsing of DHO_NWIP_SUBOPTIONS (code 63 - rfc 2242) is unsupported.
+
+Automatic parsing of DHO_USER_CLASS (code 77 - rfc 3004) is unsupported.
+
+=head1 SEE ALSO
+
+L<Net::DHCP::Packet>, L<Net::DHCP::Options>
+
+=head1 AUTHOR
+
+Stephan Hadinger E<lt>shadinger@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut