/* * Copyright (C) 2017, University of the Basque Country (UPV/EHU) * Contact for licensing options: <licensing-mcpttclient(at)mcopenplatform(dot)com> * * The original file was part of Open Source Doubango Framework * Copyright (C) 2010-2011 Mamadou Diop. * Copyright (C) 2012 Doubango Telecom <http://doubango.org> * * This file is part of Open Source Doubango Framework. * * DOUBANGO 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. * * DOUBANGO 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 DOUBANGO. * */ /**@file tnet_dhcp_option.h * @brief DHCP Options and BOOTP Vendor Extensions as per RFC 2132. * * @author Mamadou Diop <diopmamadou(at)doubango[dot]org> * */ #ifndef TNET_DHCP_OPTION_H #define TNET_DHCP_OPTION_H #include "tinynet_config.h" #include "tsk_buffer.h" #include "tsk_string.h" TNET_BEGIN_DECLS #define TNET_DHCP_OPTION(self) ((tnet_dhcp_option_t*)(self)) typedef enum tnet_dhcp_option_code_e { dhcp_code_Pad= 0 ,/**< Pad 0 None [RFC2132] */ dhcp_code_Subnet_Mask= 1 ,/**< Subnet Mask 4 Subnet Mask Value [RFC2132] */ dhcp_code_Time_Offset= 2 ,/**< Time Offset 4 Time Offset in Seconds from UTC [RFC2132] (note: deprecated by 100 and 101) */ dhcp_code_Router= 3 ,/**< Router N N/4 Router addresses [RFC2132] */ dhcp_code_Time_Server= 4 ,/**< Time Server N N/4 Timeserver addresses [RFC2132] */ dhcp_code_Name_Server= 5 ,/**< Name Server N N/4 IEN-116 Server addresses [RFC2132] */ dhcp_code_Domain_Server= 6 ,/**< Domain Server N N/4 DNS Server addresses [RFC2132] */ dhcp_code_Log_Server= 7 ,/**< Log Server N N/4 Logging Server addresses [RFC2132] */ dhcp_code_Quotes_Server= 8 ,/**< Quotes Server N N/4 Quotes Server addresses [RFC2132] */ dhcp_code_LPR_Server= 9 ,/**< LPR Server N N/4 Printer Server addresses [RFC2132] */ dhcp_code_Impress_Server= 10 ,/**< Impress Server N N/4 Impress Server addresses [RFC2132] */ dhcp_code_RLP_Server= 11 ,/**< RLP Server N N/4 RLP Server addresses [RFC2132] */ dhcp_code_Hostname= 12 ,/**< Hostname N Hostname string [RFC2132] */ dhcp_code_Boot_File_Size= 13 ,/**< Boot File Size 2 Size of boot file in 512 byte chunks [RFC2132] */ dhcp_code_Merit_Dump_File= 14 ,/**< Merit Dump File N Client to dump and name the file to dump it to [RFC2132] */ dhcp_code_Domain_Name= 15 ,/**< Domain Name N The DNS domain name of the client [RFC2132] */ dhcp_code_Swap_Server= 16 ,/**< Swap Server N Swap Server address [RFC2132] */ dhcp_code_Root_Path= 17 ,/**< Root Path N Path name for root disk [RFC2132] */ dhcp_code_Extension_File= 18 ,/**< Extension File N Path name for more BOOTP info [RFC2132] */ dhcp_code_Forward_On_Off= 19 ,/**< Forward On/Off 1 Enable/Disable IP Forwarding [RFC2132] */ dhcp_code_SrcRte_On_Off = 20 ,/**< SrcRte On/Off 1 Enable/Disable Source Routing [RFC2132] */ dhcp_code_Policy_Filter= 21 ,/**< Policy Filter N Routing Policy Filters [RFC2132] */ dhcp_code_Max_DG_Assembly= 22 ,/**< Max DG Assembly 2 Max Datagram Reassembly Size [RFC2132] */ dhcp_code_Default_IP_TTL= 23 ,/**< Default IP TTL 1 Default IP Time to Live [RFC2132] */ dhcp_code_MTU_Timeout= 24 ,/**< MTU Timeout 4 Path MTU Aging Timeout [RFC2132] */ dhcp_code_MTU_Plateau= 25 ,/**< MTU Plateau N Path MTU Plateau Table [RFC2132] */ dhcp_code_MTU_Interface= 26 ,/**< MTU Interface 2 Interface MTU Size [RFC2132] */ dhcp_code_MTU_Subnet= 27 ,/**< MTU Subnet 1 All Subnets are Local [RFC2132] */ dhcp_code_Broadcast_Address= 28 ,/**< Broadcast Address 4 Broadcast Address [RFC2132] */ dhcp_code_Mask_Discovery= 29 ,/**< Mask Discovery 1 Perform Mask Discovery [RFC2132] */ dhcp_code_Mask_Supplier= 30 ,/**< Mask Supplier 1 Provide Mask to Others [RFC2132] */ dhcp_code_Router_Discovery= 31 ,/**< Router Discovery 1 Perform Router Discovery [RFC2132] */ dhcp_code_Router_Request= 32 ,/**< Router Request 4 Router Solicitation Address [RFC2132] */ dhcp_code_Static_Route= 33 ,/**< Static Route N Static Routing Table [RFC2132] */ dhcp_code_Trailers= 34 ,/**< Trailers 1 Trailer Encapsulation [RFC2132] */ dhcp_code_ARP_Timeout= 35 ,/**< ARP Timeout 4 ARP Cache Timeout [RFC2132] */ dhcp_code_Ethernet= 36 ,/**< Ethernet 1 Ethernet Encapsulation [RFC2132] */ dhcp_code_Default_TCP_TTL= 37 ,/**< Default TCP TTL 1 Default TCP Time to Live [RFC2132] */ dhcp_code_Keepalive_Time= 38 ,/**< Keepalive Time 4 TCP Keepalive Interval [RFC2132] */ dhcp_code_Keepalive_Data= 39 ,/**< Keepalive Data 1 TCP Keepalive Garbage [RFC2132] */ dhcp_code_NIS_Domain= 40 ,/**< NIS Domain N NIS Domain Name [RFC2132] */ dhcp_code_NIS_Servers= 41 ,/**< NIS Servers N NIS Server Addresses [RFC2132] */ dhcp_code_NTP_Servers= 42 ,/**< NTP Servers N NTP Server Addresses [RFC2132] */ dhcp_code_Vendor_Specific= 43 ,/**< Vendor Specific N Vendor Specific Information [RFC2132] */ dhcp_code_NETBIOS_Name_Srv= 44 ,/**< NETBIOS Name Srv N NETBIOS Name Servers [RFC2132] */ dhcp_code_NETBIOS_Dist_Srv= 45 ,/**< NETBIOS Dist Srv N NETBIOS Datagram Distribution [RFC2132] */ dhcp_code_NETBIOS_Node_Type= 46 ,/**< NETBIOS Node Type 1 NETBIOS Node Type [RFC2132] */ dhcp_code_NETBIOS_Scope= 47 ,/**< NETBIOS Scope N NETBIOS Scope [RFC2132] */ dhcp_code_X_Window_Font= 48 ,/**< X Window Font N X Window Font Server [RFC2132] */ dhcp_code_X_Window_Manager= 49 ,/**< X Window Manager N X Window Display Manager [RFC2132] */ dhcp_code_Address_Request= 50 ,/**< Address Request 4 Requested IP Address [RFC2132] */ dhcp_code_Address_Time= 51 ,/**< Address Time 4 IP Address Lease Time [RFC2132] */ dhcp_code_Overload= 52 ,/**< Overload 1 Overload "sname" or "file" [RFC2132] */ dhcp_code_DHCP_Msg_Type= 53 ,/**< DHCP Msg Type 1 DHCP Message Type [RFC2132] */ dhcp_code_DHCP_Server_Id= 54 ,/**< DHCP Server Id 4 DHCP Server Identification [RFC2132] */ dhcp_code_Parameter_List= 55 ,/**< Parameter List N Parameter Request List [RFC2132] */ dhcp_code_DHCP_Error_Message= 56 ,/**< DHCP Message N DHCP Error Message [RFC2132] */ dhcp_code_DHCP_Max_Msg_Size= 57 ,/**< DHCP Max Msg Size 2 DHCP Maximum Message Size [RFC2132] */ dhcp_code_Renewal_Time= 58 ,/**< Renewal Time 4 DHCP Renewal (T1) Time [RFC2132] */ dhcp_code_Rebinding_Time= 59 ,/**< Rebinding Time 4 DHCP Rebinding (T2) Time [RFC2132] */ dhcp_code_Class_Id= 60 ,/**< Class Id N Class Identifier [RFC2132] */ dhcp_code_Client_Id= 61 ,/**< Client Id N Client Identifier [RFC2132] */ dhcp_code_NetWare_IP_Domain= 62 ,/**< NetWare/IP Domain N NetWare/IP Domain Name [RFC2242] */ dhcp_code_NetWare_IP_Option= 63 ,/**< NetWare/IP Option N NetWare/IP sub Options [RFC2242] */ dhcp_code_NIS_Domain_Name= 64 ,/**< NIS-Domain-Name N NIS+ v3 Client Domain Name [RFC2132] */ dhcp_code_NIS_Server_Addr = 65 ,/**< NIS-Server-Addr N NIS+ v3 Server Addresses [RFC2132] */ dhcp_code_Server_Name= 66 ,/**< Server-Name N TFTP Server Name [RFC2132] */ dhcp_code_Bootfile_Name= 67 ,/**< Bootfile-Name N Boot File Name [RFC2132] */ dhcp_code_Home_Agent_Addrs= 68 ,/**< Home-Agent-Addrs N Home Agent Addresses [RFC2132] */ dhcp_code_SMTP_Server= 69 ,/**< SMTP-Server N Simple Mail Server Addresses [RFC2132] */ dhcp_code_POP3_Server= 70 ,/**< POP3-Server N Post Office Server Addresses [RFC2132] */ dhcp_code_NNTP_Server= 71 ,/**< NNTP-Server N Network News Server Addresses [RFC2132] */ dhcp_code_WWW_Server= 72 ,/**< WWW-Server N WWW Server Addresses [RFC2132] */ dhcp_code_Finger_Server= 73 ,/**< Finger-Server N Finger Server Addresses [RFC2132] */ dhcp_code_IRC_Server= 74 ,/**< IRC-Server N Chat Server Addresses [RFC2132] */ dhcp_code_StreetTalk_Server= 75 ,/**< StreetTalk-Server N StreetTalk Server Addresses [RFC2132] */ dhcp_code_STDA_Server= 76 ,/**< STDA-Server N ST Directory Assist. Addresses [RFC2132] */ dhcp_code_User_Class= 77 ,/**< User-Class N User Class Information [RFC3004] */ dhcp_code_Directory_Agent = 78 ,/**< Directory Agent N directory agent information [RFC2610] */ dhcp_code_Service_Scope = 79 ,/**< Service Scope N service location agent scope [RFC2610] */ dhcp_code_Rapid_Commit= 80 ,/**< Rapid Commit 0 Rapid Commit [RFC4039] */ dhcp_code_Client_FQDN = 81 ,/**< Client FQDN N Fully Qualified Domain Name [RFC4702] */ dhcp_code_Relay_Agent_Information= 82 ,/**< Relay Agent Information N Relay Agent Information [RFC3046] */ dhcp_code_iSNS= 83 ,/**< iSNS N Internet Storage Name Service [RFC4174] */ //84 REMOVED/Unassigned [RFC3679] */ dhcp_code_NDS_Servers= 85 ,/**< NDS Servers N Novell Directory Services [RFC2241] */ dhcp_code_NDS_Tree_Name= 86 ,/**< NDS Tree Name N Novell Directory Services [RFC2241] */ dhcp_code_NDS_Context= 87 ,/**< NDS Context N Novell Directory Services [RFC2241] */ dhcp_code_BCMCS_Controller_Domain_Name_list= 88 ,/**< BCMCS Controller Domain Name list [RFC4280] */ dhcp_code_BCMCS_Controller_IPv4_address_option= 89 ,/**< BCMCS Controller IPv4 address option [RFC4280] */ dhcp_code_Authentication= 90 ,/**< Authentication N Authentication [RFC3118] */ dhcp_code_client_last_transaction_time= 91 ,/**< client-last-transaction-time option [RFC4388] */ dhcp_code_associated_ip= 92 ,/**< associated-ip option [RFC4388] */ dhcp_code_Client_System = 93 ,/**< Client System N Client System Architecture [RFC4578] */ dhcp_code_Client_NDI = 94 ,/**< Client NDI N Client Network Device Interface [RFC4578] */ dhcp_code_LDAP= 95 ,/**< LDAP N Lightweight Directory Access Protocol [RFC3679] */ dhcp_code_REMOVED_Unassigned= 96 ,/**< REMOVED/Unassigned [RFC3679] */ dhcp_code_UUID_GUID= 97 ,/**< UUID/GUID N UUID/GUID-based Client Identifier [RFC4578] */ dhcp_code_User_Auth= 98 ,/**< User-Auth N Open Group's User Authentication [RFC2485] */ dhcp_code_GEOCONF_CIVIC= 99 ,/**< GEOCONF_CIVIC [RFC4776] */ dhcp_code_PCode= 100 ,/**< PCode N IEEE 1003.1 TZ String [RFC4833] */ dhcp_code_TCode= 101 ,/**< TCode N Reference to the TZ Database [RFC4833] */ //102-107 REMOVED/Unassigned [RFC3679] //108 REMOVED/Unassigned [RFC3679] //109 Unassigned [RFC3679] //110 REMOVED/Unassigned [RFC3679] //111 Unassigned [RFC3679] dhcp_code_Netinfo_Address= 112 ,/**< Netinfo Address N NetInfo Parent Server Address [RFC3679] */ dhcp_code_Netinfo_Tag= 113 ,/**< Netinfo Tag N NetInfo Parent Server Tag [RFC3679] */ dhcp_code_= 114 ,/**< URL N URL [RFC3679] */ //115 REMOVED/Unassigned [RFC3679] dhcp_code_Auto_Config= 116 ,/**< Auto-Config N DHCP Auto-Configuration [RFC2563] */ dhcp_code_Name_Service_Search= 117 ,/**< Name Service Search N Name Service Search [RFC2937] */ dhcp_code_Subnet_Selection_Option= 118 ,/**< Subnet Selection Option 4 Subnet Selection Option [RFC3011] */ dhcp_code_Domain_Search= 119 ,/**< Domain Search N DNS domain search list [RFC3397] */ dhcp_code_SIP_Servers_DHCP_Option= 120 ,/**< SIP Servers DHCP Option N SIP Servers DHCP Option [RFC3361] */ dhcp_code_Classless_Static_Route_Option= 121 ,/**< Classless Static Route Option N Classless Static Route Option [RFC3442] */ dhcp_code_CCC= 122 ,/**< CCC N CableLabs Client Configuration [RFC3495] */ dhcp_code_GeoConf_Option= 123 ,/**< GeoConf Option 16 GeoConf Option [RFC3825] */ dhcp_code_V_I_Vendor_Class= 124 ,/**< V-I Vendor Class Vendor-Identifying Vendor Class [RFC3925] */ dhcp_code_V_I_Vendor_Specific_Information= 125 ,/**< V-I Vendor-Specific Information Vendor-Identifying Vendor-Specific Information [RFC3925] */ //dhcp_code_= 126 ,/**< Removed/Unassigned [RFC3679] */ //dhcp_code_= 127 ,/**< Removed/Unassigned [RFC3679] */ //dhcp_code_PXE - undefined= 128 ,/**< PXE - undefined (vendor specific) [RFC4578] */ dhcp_code_Etherboot_signature= 128 ,/**< Etherboot signature. 6 bytes: E4:45:74:68:00:00 */ dhcp_code_DOCSIS= 128 ,/**< DOCSIS "full security" server IP address */ dhcp_code_TFTP_Server_IP= 128 ,/**< TFTP Server IP address (for IP Phone software load) */ //dhcp_code_= 129 ,/**< PXE - undefined (vendor specific) [RFC4578] */ dhcp_code_Kernel_options= 129 ,/**< Kernel options. Variable length string */ dhcp_code_Call_Server_IP= 129 ,/**< Call Server IP address */ //dhcp_code_= 130 ,/**< PXE - undefined (vendor specific) [RFC4578] */ dhcp_code_Ethernet_interface= 130 ,/**< Ethernet interface. Variable length string. */ dhcp_code_Discrimination= 130 ,/**< Discrimination string (to identify vendor) */ //dhcp_code_= 131 ,/**< PXE - undefined (vendor specific) [RFC4578] */ dhcp_code_Remote_statistics_server_IP= 131 ,/**< Remote statistics server IP address */ //dhcp_code_= 132 ,/**< PXE - undefined (vendor specific) [RFC4578] */ dhcp_code_IEEE_802_1Q_VLAN_ID= 132 ,/**< IEEE 802.1Q VLAN ID */ //dhcp_code_= 133 ,/**< PXE - undefined (vendor specific) [RFC4578] */ dhcp_code_IEEE_802_1D_p= 133 ,/**< IEEE 802.1D/p Layer 2 Priority */ //dhcp_code_= 134 ,/**< PXE - undefined (vendor specific) [RFC4578] */ dhcp_code_DSCP= 134 ,/**< Diffserv Code Point (DSCP) for VoIP signalling and media streams */ //dhcp_code_= 135 ,/**< PXE - undefined (vendor specific) [RFC4578] */ dhcp_code_HTTP_Proxy= 135 ,/**< HTTP Proxy for phone-specific applications */ dhcp_code_OPTION_PANA_AGENT= 136 ,/**< OPTION_PANA_AGENT [RFC5192] */ dhcp_code_OPTION_V4_LOST= 137 ,/**< OPTION_V4_LOST [RFC5223] */ dhcp_code_OPTION_CAPWAP_AC_V4= 138 ,/**< OPTION_CAPWAP_AC_V4 N CAPWAP Access Controller addresses [RFC5417] */ dhcp_code_OPTION_IPv4_Address_MoS= 139 ,/**< OPTION-IPv4_Address-MoS N a series of suboptions [RFC5678] */ dhcp_code_OPTION_IPv4_FQDN_MoS= 140 ,/**< OPTION-IPv4_FQDN-MoS N a series of suboptions [RFC5678] */ //141-149 Unassigned [RFC3942] */ dhcp_code_TFTP_server_address= 150 ,/**< TFTP server address (Tentatively Assigned - 2005-06-23) */ dhcp_code_Etherboot= 150 ,/**< Etherboot */ dhcp_code_GRUB_configuration_path_name= 150 ,/**< GRUB configuration path name */ //151-174 Unassigned [RFC3942] //dhcp_code_Etherboot= 175 ,/**< Etherboot (Tentatively Assigned - 2005-06-23) */ dhcp_code_IP_Telephone= 176 ,/**< IP Telephone (Tentatively Assigned - 2005-06-23) */ //dhcp_code_Etherboot= 177 ,/**< Etherboot (Tentatively Assigned - 2005-06-23) */ dhcp_code_PacketCable_and_CableHome= 177 ,/**< PacketCable and CableHome (replaced by 122) */ //178-207 Unassigned [RFC3942] dhcp_code_PXELINUX_Magic= 208 ,/**< PXELINUX Magic 4 magic string = F1:00:74:7E [RFC5071] Deprecated */ dhcp_code_Configuration_File= 209 ,/**< Configuration File N Configuration file [RFC5071] */ dhcp_code_Path_Prefix= 210 ,/**< Path Prefix N Path Prefix Option [RFC5071] */ dhcp_code_Reboot_Time = 211 ,/**< Reboot Time 4 Reboot Time [RFC5071] */ // 212-219 Unassigned dhcp_code_Subnet_Allocation= 220 ,/**< Subnet Allocation Option (Tentatively Assigned - 2005-06-23) */ dhcp_code_Virtual_Subnet= 221 ,/**< Virtual Subnet Selection Option (Tentatively Assigned - 2005-06-23) */ // 222-223 Unassigned [RFC3942] //224-254 Reserved (Private Use) dhcp_code_null=224 , dhcp_code_End= 255 ,/**< End 0 None [RFC2132] */ } tnet_dhcp_option_code_t; /** DHCP/BOOTP option as per RFC 2132. * Format ==> subclause 2. */ typedef struct tnet_dhcp_option_s { TSK_DECLARE_OBJECT; tsk_bool_t initialized; tnet_dhcp_option_code_t code; /**< 1-byte option-code. */ tsk_buffer_t *value; } tnet_dhcp_option_t; typedef tsk_list_t tnet_dhcp_options_L_t; #define TNET_DECLARE_DHCP_OPTION tnet_dhcp_option_t dhcp_option int tnet_dhcp_option_init(tnet_dhcp_option_t *self, tnet_dhcp_option_code_t code); int tnet_dhcp_option_deinit(tnet_dhcp_option_t *self); tnet_dhcp_option_t* tnet_dhcp_option_deserialize(const void* data, tsk_size_t size); int tnet_dhcp_option_serialize(const tnet_dhcp_option_t* self, tsk_buffer_t *output); int tnet_dhcp_option_serializeex(tnet_dhcp_option_code_t code, uint8_t length, const void* value, tsk_buffer_t *output); /*======================================================================================= * RFC 2132 - 9.8. Parameter Request List *=======================================================================================*/ /** Parameter Request List Option */ typedef struct tnet_dhcp_option_paramslist_s { TNET_DECLARE_DHCP_OPTION; /* RFC 2132 - 9.8. Parameter Request List Code Len Option Codes +-----+-----+-----+-----+--- | 55 | n | c1 | c2 | ... +-----+-----+-----+-----+--- */ } tnet_dhcp_option_paramslist_t; int tnet_dhcp_option_paramslist_add_code(tnet_dhcp_option_paramslist_t* self, tnet_dhcp_option_code_t code); /*======================================================================================= * RFC 2132 - 3.8. Domain Name Server Option *=======================================================================================*/ /** Domain Name Server Option */ typedef struct tnet_dhcp_option_dns_s { TNET_DECLARE_DHCP_OPTION; /* RFC 2132 - 3.8. Domain Name Server Option Code Len Address 1 Address 2 +-----+-----+-----+-----+-----+-----+-----+-----+-- | 6 | n | a1 | a2 | a3 | a4 | a1 | a2 | ... +-----+-----+-----+-----+-----+-----+-----+-----+-- */ tsk_strings_L_t *servers; } tnet_dhcp_option_dns_t; TINYNET_API tnet_dhcp_option_t* tnet_dhcp_option_create(tnet_dhcp_option_code_t code); TINYNET_API tnet_dhcp_option_paramslist_t* tnet_dhcp_option_paramslist_create(); TINYNET_API tnet_dhcp_option_dns_t* tnet_dhcp_option_dns_create(const void* payload, tsk_size_t payload_size); TINYNET_GEXTERN const tsk_object_def_t *tnet_dhcp_option_def_t; TINYNET_GEXTERN const tsk_object_def_t *tnet_dns_ns_def_t; TINYNET_GEXTERN const tsk_object_def_t *tnet_dhcp_option_paramslist_def_t; TINYNET_GEXTERN const tsk_object_def_t *tnet_dhcp_option_dns_def_t; TNET_END_DECLS #endif /* TNET_DHCP_OPTION_H */