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