Source code for dhcp_types.constants

# -*- encoding: utf-8 -*-
"""
libpydhcpserver.dhcp_types.constants
====================================
DHCP mappings and constant values.

Legal
=====
This file is part of libpydhcpserver.
libpydhcpserver is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

(C) Neil Tallim, 2014 <flan@uguu.ca>
(C) Mathieu Ignacio, 2008 <mignacio@april.org>
"""
import array

TYPE_IPV4 = "ipv4" #: Four bytes in network-byte-order.
TYPE_IPV4_PLUS = "ipv4+" #: At least one multiple of four bytes in network-byte-order.
TYPE_IPV4_MULT = "ipv4*" #: Multiples of four bytes in network-byte-order.
TYPE_BYTE = "byte" #: A single byte.
TYPE_BYTE_PLUS = "byte+" #: At least one byte.
TYPE_STRING = "string" #: Any number of bytes.
TYPE_BOOL = "bool" #: A single byte, constrained to the values 0 (false) and 1 (true).
TYPE_INT = "16-bits" #: Two bytes in network-byte-order.
TYPE_INT_PLUS = "16-bits+" #: At least one multiple of two bytes in network-byte-order.
TYPE_LONG = "32-bits" #: Four bytes in network-byte-order.
TYPE_LONG_PLUS = "32-bits+" #: At least one multiple of four bytes in network-byte-order.
TYPE_IDENTIFIER = "identifier" #: Two bytes in small-endian order.
TYPE_NONE = "none" #: A zero-length sequence.

FIELD_OP = "op" #: The DHCP operation type (Request or Response).
FIELD_HTYPE = "htype" #: The type of hardware involved.
FIELD_HLEN = "hlen" #: The length of the hardware address.
FIELD_HOPS = "hops" #: The number of hops across which the packet has been transmitted.
FIELD_XID = "xid" #: The transaction ID.
FIELD_SECS = "secs" #: The number of seconds that have elapsed since the packet was first emitted.
FIELD_FLAGS = "flags" #: DHCP flags set on the packet.
FIELD_CIADDR = "ciaddr" #: The client's address.
FIELD_YIADDR = "yiaddr" #: The issued address.
FIELD_SIADDR = "siaddr" #: The server's address.
FIELD_GIADDR = "giaddr" #: The gateway's address.
FIELD_CHADDR = "chaddr" #: The hardware address.
FIELD_SNAME = "sname" #: BOOTP server hostname.
FIELD_FILE = "file" #: BOOTP filename.

MAGIC_COOKIE = '\x63\x82\x53\x63' #: The DHCP magic cookie, per RFC 1048.
MAGIC_COOKIE_ARRAY = array.array('B', MAGIC_COOKIE) #: The DHCP magic cookie as an array of bytes.

DHCP_OP_NAMES = {
 0: 'ERROR_UNDEF',
 1: 'BOOTREQUEST',
 2: 'BOOTREPLY',
} #: Mapping from DHCP operation types to human-readable names.
DHCP_TYPE_NAMES = {
 0: 'ERROR_UNDEF',
 1: 'DHCP_DISCOVER', 2: 'DHCP_OFFER',
 3: 'DHCP_REQUEST', 4:'DHCP_DECLINE',
 5: 'DHCP_ACK', 6: 'DHCP_NAK',
 7: 'DHCP_RELEASE',
 8: 'DHCP_INFORM',
 9: 'DHCP_FORCERENEW',
 10: 'DHCP_LEASEQUERY', 11: 'DHCP_LEASEUNASSIGNED',
 12: 'DHCP_LEASEUNKNOWN', 13: 'DHCP_LEASEACTIVE',
} #: Mapping from DHCP option values to human-readable names.

DHCP_FIELDS = {
 FIELD_OP: (0, 1),
 FIELD_HTYPE: (1, 1),
 FIELD_HLEN: (2, 1),
 FIELD_HOPS: (3, 1),
 FIELD_XID: (4, 4),
 FIELD_SECS: (8, 2),
 FIELD_FLAGS: (10, 2),
 FIELD_CIADDR: (12, 4),
 FIELD_YIADDR: (16, 4),
 FIELD_SIADDR: (20, 4),
 FIELD_GIADDR: (24, 4),
 FIELD_CHADDR: (28, 6),
 FIELD_SNAME: (44, 64),
 FIELD_FILE: (108, 128),
} #: Byte-offset and size definitions for DHCP fields.

DHCP_FIELDS_TEXT = (
    FIELD_SNAME,
    FIELD_FILE,
) #: All DHCP fields for which data should be padded as needed

DHCP_FIELDS_SPECS = {
 TYPE_IPV4: (4, 0, 1), TYPE_IPV4_PLUS: (0, 4, 4), TYPE_IPV4_MULT: (0, 0, 4),
 TYPE_BYTE: (1, 0, 1), TYPE_BYTE_PLUS: (0, 1, 1),
 TYPE_STRING: (0, 0, 1),
 TYPE_BOOL: (1, 0, 1),
 TYPE_INT: (2, 0, 1), TYPE_INT_PLUS: (0, 2, 2),
 TYPE_LONG: (4, 0, 1), TYPE_LONG_PLUS: (0, 4, 4),
 TYPE_IDENTIFIER: (0, 2, 1),
 TYPE_NONE: (0, 0, 1),
}
"""
Information about how to validate basic DHCP types.

The human-readable format-name is mapped against a
(fixed_length, minimum_length, multiple) tuple, which is handled by the
following pseudocode::
    
    if fixed_length == 0:
        if (
            len(value) < minimum_length or
            len(value) % (multiple * minimum_length) != 0
        ):
            fail
    elif len(value) != fixed_length:
        fail
"""

DHCP_FIELDS_TYPES = {
 FIELD_OP: TYPE_BYTE,
 FIELD_HTYPE: TYPE_BYTE,
 FIELD_HLEN: TYPE_BYTE,
 FIELD_HOPS: TYPE_BYTE,
 FIELD_XID: TYPE_LONG,
 FIELD_SECS: TYPE_INT,
 FIELD_FLAGS: TYPE_INT,
 FIELD_CIADDR: TYPE_IPV4,
 FIELD_YIADDR: TYPE_IPV4,
 FIELD_SIADDR: TYPE_IPV4,
 FIELD_GIADDR: TYPE_IPV4,
 FIELD_CHADDR: "hwmac",
 FIELD_SNAME: TYPE_STRING,
 FIELD_FILE: TYPE_STRING,
} #: Maps human-readable field-names to DHCP fields specs.

DHCP_OPTIONS_TYPES = {
 #0: PAD
 1: TYPE_IPV4,
 2: TYPE_LONG,
 3: TYPE_IPV4_PLUS,
 4: TYPE_IPV4_PLUS,
 5: TYPE_IPV4_PLUS,
 6: TYPE_IPV4_PLUS,
 7: TYPE_IPV4_PLUS,
 8: TYPE_IPV4_PLUS,
 9: TYPE_IPV4_PLUS,
 10: TYPE_IPV4_PLUS,
 11: TYPE_IPV4_PLUS,
 12: TYPE_STRING,
 13: TYPE_INT,
 14: TYPE_STRING,
 15: TYPE_STRING,
 16: TYPE_IPV4,
 17: TYPE_STRING,
 18: TYPE_STRING,
 19: TYPE_BOOL,
 20: TYPE_BOOL,
 21: TYPE_IPV4_PLUS,
 22: TYPE_INT,
 23: TYPE_BYTE,
 24: TYPE_LONG,
 25: TYPE_INT_PLUS,
 26: TYPE_INT,
 27: TYPE_BOOL,
 28: TYPE_IPV4,
 29: TYPE_BOOL,
 30: TYPE_BOOL,
 31: TYPE_BOOL,
 32: TYPE_IPV4,
 33: TYPE_IPV4_PLUS,
 34: TYPE_BOOL,
 35: TYPE_LONG,
 36: TYPE_BOOL,
 37: TYPE_BYTE,
 38: TYPE_LONG,
 39: TYPE_BOOL,
 40: TYPE_STRING,
 41: TYPE_IPV4_PLUS,
 42: TYPE_IPV4_PLUS,
 43: TYPE_BYTE_PLUS,
 44: TYPE_IPV4_PLUS,
 45: TYPE_IPV4_PLUS,
 46: TYPE_BYTE,
 47: TYPE_STRING,
 48: TYPE_IPV4_PLUS,
 49: TYPE_IPV4_PLUS,
 50: TYPE_IPV4,
 51: TYPE_LONG,
 52: TYPE_BYTE,
 53: TYPE_BYTE,
 54: TYPE_IPV4,
 55: TYPE_BYTE_PLUS,
 56: TYPE_STRING,
 57: TYPE_INT,
 58: TYPE_LONG,
 59: TYPE_LONG,
 60: TYPE_STRING,
 61: TYPE_IDENTIFIER,
 62: TYPE_STRING,
 63: TYPE_BYTE_PLUS,
 64: TYPE_STRING,
 65: TYPE_IPV4_PLUS,
 66: TYPE_STRING,
 67: TYPE_STRING,
 68: TYPE_IPV4_MULT,
 69: TYPE_IPV4_PLUS,
 70: TYPE_IPV4_PLUS,
 71: TYPE_IPV4_PLUS,
 72: TYPE_IPV4_PLUS,
 73: TYPE_IPV4_PLUS,
 74: TYPE_IPV4_PLUS,
 75: TYPE_IPV4_PLUS,
 76: TYPE_IPV4_PLUS,
 77: TYPE_STRING,
 78: "RFC2610_78", #Implemented
 79: "RFC2610_79", #Implemented
 80: TYPE_NONE,
 81: TYPE_STRING,
 82: TYPE_BYTE_PLUS,
 83: "RFC4174_83", #Implemented
 84: "Unassigned",
 85: TYPE_IPV4_PLUS,
 86: TYPE_BYTE_PLUS,
 87: TYPE_BYTE_PLUS,
 88: "RFC4280_88", #Implemented
 89: TYPE_IPV4_PLUS,
 90: "RFC3118_90", #Not implemented; not necessary for static model
 91: TYPE_LONG,
 92: TYPE_IPV4_PLUS,
 93: TYPE_INT_PLUS,
 94: TYPE_BYTE_PLUS,
 95: TYPE_STRING, #Specifications not published
 96: "Unassigned",
 97: TYPE_BYTE_PLUS,
 98: TYPE_STRING,
 99: TYPE_BYTE_PLUS,
 100: TYPE_STRING,
 101: TYPE_STRING,
 102: "Unassigned", 103: "Unassigned", 104: "Unassigned", 105: "Unassigned",
 106: "Unassigned", 107: "Unassigned", 108: "Unassigned", 109: "Unassigned",
 110: "Unassigned", 111: "Unassigned",
 112: TYPE_STRING, #Specifications not published
 113: TYPE_STRING, #Specifications not published
 114: TYPE_STRING, #Specifications not published
 115: "Unassigned",
 116: TYPE_BOOL,
 117: TYPE_INT_PLUS,
 118: TYPE_IPV4,
 119: "RFC3397_119", #Implemented
 120: "RFC3361_120", #Implemented
 121: "RFC3442_121", #Implemented
 122: TYPE_STRING,
 123: TYPE_BYTE_PLUS,
 124: TYPE_STRING,
 125: TYPE_STRING,
 126: "Unassigned", 127: "Unassigned",
 128: TYPE_STRING,
 129: TYPE_STRING,
 130: TYPE_STRING,
 131: TYPE_STRING,
 132: TYPE_STRING,
 133: TYPE_STRING,
 134: TYPE_STRING,
 135: TYPE_STRING,
 136: TYPE_IPV4_PLUS,
 137: "RFC5223_137", #Implemented
 138: TYPE_IPV4_PLUS,
 139: "RFC5678_139", #Implemented
 140: "RFC5678_140", #Implemented
 141: "Unassigned", 142: "Unassigned", 143: "Unassigned", 144: "Unassigned",
 145: "Unassigned", 146: "Unassigned", 147: "Unassigned", 148: "Unassigned",
 149: "Unassigned",
 150: "Unassigned", #TFTP server address
 151: "Unassigned", 152: "Unassigned", 153: "Unassigned", 154: "Unassigned",
 155: "Unassigned", 156: "Unassigned", 157: "Unassigned", 158: "Unassigned",
 159: "Unassigned", 160: "Unassigned", 161: "Unassigned", 162: "Unassigned",
 163: "Unassigned", 164: "Unassigned", 165: "Unassigned", 166: "Unassigned",
 167: "Unassigned", 168: "Unassigned", 169: "Unassigned", 170: "Unassigned",
 171: "Unassigned", 172: "Unassigned", 173: "Unassigned", 174: "Unassigned",
 175: TYPE_STRING,
 176: "Unassigned", #IP Telephone
 177: "Unassigned", #Etherboot
 178: "Unassigned", 179: "Unassigned", 180: "Unassigned", 181: "Unassigned",
 182: "Unassigned", 183: "Unassigned", 184: "Unassigned", 185: "Unassigned",
 186: "Unassigned", 187: "Unassigned", 188: "Unassigned", 189: "Unassigned",
 190: "Unassigned", 191: "Unassigned", 192: "Unassigned", 193: "Unassigned",
 194: "Unassigned", 195: "Unassigned", 196: "Unassigned", 197: "Unassigned",
 198: "Unassigned", 199: "Unassigned", 200: "Unassigned", 201: "Unassigned",
 202: "Unassigned", 203: "Unassigned", 204: "Unassigned", 205: "Unassigned",
 206: "Unassigned", 207: "Unassigned",
 208: TYPE_LONG,
 209: TYPE_STRING,
 210: TYPE_STRING,
 211: TYPE_LONG,
 212: "Unassigned", 213: "Unassigned", 214: "Unassigned", 215: "Unassigned",
 216: "Unassigned", 217: "Unassigned", 218: "Unassigned", 219: "Unassigned",
 220: "Unassigned", #Subnet Allocation Option
 221: "Unassigned", #Virtual Subnet Selection Option
 222: "Unassigned", 223: "Unassigned",
 224: "Reserved", 225: "Reserved", 226: "Reserved", 227: "Reserved",
 228: "Reserved", 229: "Reserved", 230: "Reserved", 231: "Reserved",
 232: "Reserved", 233: "Reserved", 234: "Reserved", 235: "Reserved",
 236: "Reserved", 237: "Reserved", 238: "Reserved", 239: "Reserved",
 240: "Reserved", 241: "Reserved", 242: "Reserved", 243: "Reserved",
 244: "Reserved", 245: "Reserved", 246: "Reserved", 247: "Reserved",
 248: "Reserved", 249: "Reserved", 250: "Reserved", 251: "Reserved",
 252: "Reserved", 253: "Reserved", 254: "Reserved",
 #255: END
}
"""
Maps DHCP option-numbers to DHCP fields specs.

All values derived from http://www.iana.org/assignments/bootp-dhcp-parameters
"""

DHCP_OPTIONS = {
 #'pad': 0,
 #Vendor extensions
 'subnet_mask': 1,
 'time_offset': 2,
 'router': 3,
 'time_server': 4,
 'name_server': 5,
 'domain_name_servers': 6,
 'log_server': 7,
 'cookie_server': 8,
 'lpr_server': 9,
 'impress_server': 10,
 'resource_location_server': 11,
 'hostname': 12,
 'bootfile': 13,
 'merit_dump_file': 14,
 'domain_name': 15,
 'swap_server': 16,
 'root_path': 17,
 'extensions_path': 18,
 #IP-layer parameters per host
 'ip_forwarding': 19,
 'nonlocal_source_routing': 20,
 'policy_filter': 21,
 'maximum_datagram_reassembly_size': 22,
 'default_ip_time-to-live': 23,
 'path_mtu_aging_timeout': 24,
 'path_mtu_table': 25,
 #IP-layer parameters per interface
 'interface_mtu': 26,
 'all_subnets_are_local': 27,
 'broadcast_address': 28,
 'perform_mask_discovery': 29,
 'mask_supplier': 30,
 'perform_router_discovery': 31,
 'router_solicitation_address': 32,
 'static_routes': 33,
 #Link-layer parameters per interface
 'trailer_encapsulation': 34,
 'arp_cache_timeout': 35,
 'ethernet_encapsulation': 36,
 #TCP parameters
 'tcp_default_ttl': 37,
 'tcp_keepalive_interval': 38,
 'tcp_keepalive_garbage': 39,
 #Applications and service parameters
 'nis_domain': 40,
 'nis_servers': 41,
 'ntp_servers': 42,
 'vendor_specific_information': 43,
 'nbns': 44,
 'nbdd': 45,'nb_node_type': 46,
 'nb_scope': 47,
 'x_window_system_font_server': 48,
 'x_window_system_display_manager': 49,
 #DHCP extensions
 'requested_ip_address': 50,
 'ip_address_lease_time': 51,
 'overload': 52,
 'dhcp_message_type': 53,
 'server_identifier': 54,
 'parameter_request_list': 55,
 'message': 56,
 'maximum_dhcp_message_size': 57,
 'renewal_time_value': 58,
 'rebinding_time_value': 59,
 'vendor_class_identifier': 60,
 'client_identifier': 61,
 #RFC 2132
 'netware_ip_domain_name': 62,
 'netware_ip_sub_options': 63,
 'nis+_domain': 64,
 'nis+_servers': 65,
 'tftp_server_name': 66,
 'bootfile_name': 67,
 'mobile_ip_home_agent': 68,
 'smtp_servers': 69,
 'pop_servers': 70,
 'nntp_servers': 71,
 'default_www_server': 72,
 'default_finger_server': 73,
 'default_irc_server': 74,
 'streettalk_server': 75,
 'streettalk_directory_assistance_server': 76,
 'user_class': 77,
 'directory_agent': 78,
 'service_scope': 79,
 'rapid_commit': 80,
 'client_fqdn': 81,
 'relay_agent': 82,
 'internet_storage_name_service': 83,
 #hole
 'nds_server': 85,
 'nds_tree_name': 86,
 'nds_context': 87,
 'bcmcs_domain_list': 88,
 'bcmcs_ipv4_list': 89,
 'authentication': 90,
 'client_last_transaction_time': 91,
 'associated_ip': 92,
 'client_system': 93,
 'client_ndi': 94,
 'ldap': 95,
 #hole
 'uuid_guid': 97,
 'open_group_user_auth': 98,
 'geoconf_civic': 99,
 'pcode': 100,
 'tcode': 101,
 #hole
 'netinfo_address': 112,
 'netinfo_tag': 113,
 'url': 114,
 #hole
 'auto_config': 116,
 'name_service_search': 117,
 'subnet_selection': 118,
 'domain_search': 119,
 'sip_servers': 120,
 'classless_static_route': 121,
 'cablelabs_client_configuration': 122,
 'geoconf': 123,
 'vendor_class': 124,
 'vendor_specific': 125,
 #hole
 'pxe_128': 128,
 'pxe_129': 129,
 'pxe_130': 130,
 'pxe_131': 131,
 'pxe_132': 132,
 'pxe_133': 133,
 'pxe_134': 134,
 'pxe_135': 135,
 'pana_agent': 136,
 'v4_lost': 137,
 'capwap_ac_v4': 138,
 'ipv4_mos': 139,
 'fqdn_mos': 140,
 #hole
 'ipxe_test': 175,
 #hole
 'pxelinux_magic': 208,
 'configuration_file': 209,
 'path_prefix': 210,
 'reboot_time': 211,
 #hole
 #'end': 255
} #: Maps human-readable DHCP option names to integer values.
DHCP_OPTIONS_REVERSE = dict((v, k) for (k, v) in DHCP_OPTIONS.iteritems()) #: Maps integer values to human-readable DHCP option names.