1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 1996-2003 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 * Copyright (c) 2016, Chris Fraire <cfraire@me.com>. 26 * Copyright 2019 Joshua M. Clulow <josh@sysmgr.org> 27 */ 28 29 /* 30 * dhcp.h - Generic DHCP definitions, as per RFC's 2131 and 2132. 31 */ 32 33 #ifndef _DHCP_H 34 #define _DHCP_H 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 #ifdef _REENTRANT 41 #include <thread.h> 42 #endif /* _REENTRANT */ 43 44 /* 45 * DHCP option codes. 46 */ 47 48 #define CD_PAD 0 49 #define CD_END 255 50 #define CD_SUBNETMASK 1 51 #define CD_TIMEOFFSET 2 52 #define CD_ROUTER 3 53 #define CD_TIMESERV 4 54 #define CD_IEN116_NAME_SERV 5 55 #define CD_DNSSERV 6 56 #define CD_LOG_SERV 7 57 #define CD_COOKIE_SERV 8 58 #define CD_LPR_SERV 9 59 #define CD_IMPRESS_SERV 10 60 #define CD_RESOURCE_SERV 11 61 #define CD_HOSTNAME 12 62 #define CD_BOOT_SIZE 13 63 #define CD_DUMP_FILE 14 64 #define CD_DNSDOMAIN 15 65 #define CD_SWAP_SERV 16 66 #define CD_ROOT_PATH 17 67 #define CD_EXTEND_PATH 18 68 69 /* IP layer parameters */ 70 #define CD_IP_FORWARDING_ON 19 71 #define CD_NON_LCL_ROUTE_ON 20 72 #define CD_POLICY_FILTER 21 73 #define CD_MAXIPSIZE 22 74 #define CD_IPTTL 23 75 #define CD_PATH_MTU_TIMEOUT 24 76 #define CD_PATH_MTU_TABLE_SZ 25 77 78 /* IP layer parameters per interface */ 79 #define CD_MTU 26 80 #define CD_ALL_SUBNETS_LCL_ON 27 81 #define CD_BROADCASTADDR 28 82 #define CD_MASK_DISCVRY_ON 29 83 #define CD_MASK_SUPPLIER_ON 30 84 #define CD_ROUTER_DISCVRY_ON 31 85 #define CD_ROUTER_SOLICIT_SERV 32 86 #define CD_STATIC_ROUTE 33 87 88 /* Link Layer Parameters per Interface */ 89 #define CD_TRAILER_ENCAPS_ON 34 90 #define CD_ARP_TIMEOUT 35 91 #define CD_ETHERNET_ENCAPS_ON 36 92 93 /* TCP Parameters */ 94 #define CD_TCP_TTL 37 95 #define CD_TCP_KALIVE_INTVL 38 96 #define CD_TCP_KALIVE_GRBG_ON 39 97 98 /* Application layer parameters */ 99 #define CD_NIS_DOMAIN 40 100 #define CD_NIS_SERV 41 101 #define CD_NTP_SERV 42 102 #define CD_VENDOR_SPEC 43 103 104 /* NetBIOS parameters */ 105 #define CD_NETBIOS_NAME_SERV 44 106 #define CD_NETBIOS_DIST_SERV 45 107 #define CD_NETBIOS_NODE_TYPE 46 108 #define CD_NETBIOS_SCOPE 47 109 110 /* X Window parameters */ 111 #define CD_XWIN_FONT_SERV 48 112 #define CD_XWIN_DISP_SERV 49 113 114 /* DHCP protocol extension options */ 115 #define CD_REQUESTED_IP_ADDR 50 116 #define CD_LEASE_TIME 51 117 #define CD_OPTION_OVERLOAD 52 118 #define CD_DHCP_TYPE 53 119 #define CD_SERVER_ID 54 120 #define CD_REQUEST_LIST 55 121 #define CD_MESSAGE 56 122 #define CD_MAX_DHCP_SIZE 57 123 #define CD_T1_TIME 58 124 #define CD_T2_TIME 59 125 #define CD_CLASS_ID 60 126 #define CD_CLIENT_ID 61 127 128 /* Netware options */ 129 #define CD_NW_IP_DOMAIN 62 130 #define CD_NW_IP_OPTIONS 63 131 132 /* Nisplus options */ 133 #define CD_NISPLUS_DMAIN 64 134 #define CD_NISPLUS_SERVS 65 135 136 /* Optional sname/bootfile options */ 137 #define CD_TFTP_SERV_NAME 66 138 #define CD_OPT_BOOTFILE_NAME 67 139 140 /* Additional server options */ 141 #define CD_MOBILE_IP_AGENT 68 142 #define CD_SMTP_SERVS 69 143 #define CD_POP3_SERVS 70 144 #define CD_NNTP_SERVS 71 145 #define CD_WWW_SERVS 72 146 #define CD_FINGER_SERVS 73 147 #define CD_IRC_SERVS 74 148 149 /* Streettalk options */ 150 #define CD_STREETTALK_SERVS 75 151 #define CD_STREETTALK_DA_SERVS 76 152 153 /* User class identifier */ 154 #define CD_USER_CLASS_ID 77 155 156 /* Newer options */ 157 158 #define CD_SLPDA 78 159 #define CD_SLPSS 79 160 #define CD_CLIENTFQDN 81 161 #define CD_AGENTOPT 82 162 163 /* 164 * Per RFC 3679, option 89 was "Never published as standard and [is] not in 165 * general use". See active CD_CLIENTFQDN and RFC 4702. 166 */ 167 #define CD_FQDN 89 168 169 #define CD_PXEARCHi 93 170 #define CD_PXENIIi 94 171 #define CD_PXECID 95 172 #define CD_MULTICST 107 173 174 #define CD_CLASSLESS_ROUTES 121 175 176 #define DHCP_FIRST_OPT CD_SUBNETMASK 177 #define DHCP_LAST_STD CD_CLASSLESS_ROUTES 178 #define DHCP_SITE_OPT 128 /* inclusive */ 179 #define DHCP_END_SITE 254 180 #define DHCP_LAST_OPT DHCP_END_SITE /* last op code */ 181 182 #define DHCP_MAX_OPT_SIZE 255 /* maximum option size in octets */ 183 184 /* 185 * DHCP Packet. What will fit in a ethernet frame. We may use a smaller 186 * size, based on what our transport can handle. 187 */ 188 #define DHCP_DEF_MAX_SIZE 576 /* as spec'ed in RFC 2131 */ 189 #define PKT_BUFFER 1486 /* max possible size of pkt buffer */ 190 #define BASE_PKT_SIZE 240 /* everything but the options */ 191 typedef struct dhcp { 192 uint8_t op; /* message opcode */ 193 uint8_t htype; /* Hardware address type */ 194 uint8_t hlen; /* Hardware address length */ 195 uint8_t hops; /* Used by relay agents */ 196 uint32_t xid; /* transaction id */ 197 uint16_t secs; /* Secs elapsed since client boot */ 198 uint16_t flags; /* DHCP Flags field */ 199 struct in_addr ciaddr; /* client IP addr */ 200 struct in_addr yiaddr; /* 'Your' IP addr. (from server) */ 201 struct in_addr siaddr; /* Boot server IP addr */ 202 struct in_addr giaddr; /* Relay agent IP addr */ 203 uint8_t chaddr[16]; /* Client hardware addr */ 204 uint8_t sname[64]; /* Optl. boot server hostname */ 205 uint8_t file[128]; /* boot file name (ascii path) */ 206 uint8_t cookie[4]; /* Magic cookie */ 207 uint8_t options[60]; /* Options */ 208 } PKT; 209 210 typedef uint32_t lease_t; /* DHCP lease time (32 bit quantity) */ 211 212 /* 213 * DHCP packet types. As per protocol. 214 */ 215 #define DISCOVER ((uint8_t)1) 216 #define OFFER ((uint8_t)2) 217 #define REQUEST ((uint8_t)3) 218 #define DECLINE ((uint8_t)4) 219 #define ACK ((uint8_t)5) 220 #define NAK ((uint8_t)6) 221 #define RELEASE ((uint8_t)7) 222 #define INFORM ((uint8_t)8) 223 224 /* 225 * Generic DHCP protocol defines 226 */ 227 #define DHCP_PERM ((lease_t)0xffffffff) /* "permanent" lease time */ 228 #define BOOTREQUEST (1) /* BOOTP REQUEST opcode */ 229 #define BOOTREPLY (2) /* BOOTP REPLY opcode */ 230 #define BOOTMAGIC { 99, 130, 83, 99 } /* rfc1048 magic cookie */ 231 #define BCAST_MASK 0x8000 /* BROADCAST flag */ 232 233 #ifdef __cplusplus 234 } 235 #endif 236 237 #endif /* _DHCP_H */ 238