4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
29 #pragma ident "%Z%%M% %I% %E% SMI"
32 * Common definitions used by Sun DHCP implementations
39 #include <sys/types.h>
40 #include <sys/socket.h>
41 #include <netinet/in.h>
42 #include <netinet/udp.h>
43 #include <netinet/dhcp.h>
44 #include <netinet/dhcp6.h>
45 #include <dhcp_symbol_common.h>
46 #include <sys/sunos_dhcp_class.h>
49 #define CD_PACKET_START 0
50 #define CD_POPCODE 0 /* packet opcode */
51 #define CD_PHTYPE 1 /* packet header type */
52 #define CD_PHLEN 2 /* packet header len */
53 #define CD_PHOPS 3 /* packet header len */
54 #define CD_PXID 4 /* packet hops */
55 #define CD_PSECS 8 /* packet xid */
56 #define CD_PFLAGS 10 /* packet secs */
57 #define CD_PCIADDR 12 /* packet flags */
58 #define CD_YIADDR 16 /* client's ip address */
59 #define CD_SIADDR 20 /* Bootserver's ip address */
60 #define CD_GIADDR 24 /* BOOTP relay agent address */
61 #define CD_PCHADDR 28 /* BOOTP relay agent address */
62 #define CD_SNAME 44 /* Hostname of Bootserver, or opts */
63 #define CD_BOOTFILE 108 /* File to boot or opts */
64 #define CD_PCOOKIE 236 /* packet cookie */
65 #define CD_POPTIONS 240 /* packet options */
66 #define CD_PACKET_END CD_POPTIONS
68 /* Internal server options */
69 #define CD_INTRNL_START 1024
70 #define CD_BOOL_HOSTNAME 1024 /* Entry wants hostname (Nameserv) */
71 #define CD_BOOL_LEASENEG 1025 /* Entry's lease is negotiable */
72 #define CD_BOOL_ECHO_VCLASS 1026 /* Echo Vendor class back to Entry */
73 #define CD_BOOTPATH 1027 /* prefix path to File to boot */
74 #define CD_INTRNL_END 1027
76 /* Error codes that could be generated while parsing packets */
77 #define DHCP_ERR_OFFSET 512
78 #define DHCP_GARBLED_MSG_TYPE (DHCP_ERR_OFFSET+0)
79 #define DHCP_WRONG_MSG_TYPE (DHCP_ERR_OFFSET+1)
80 #define DHCP_BAD_OPT_OVLD (DHCP_ERR_OFFSET+2)
83 * Arbitrary "maximum" client ID length (in bytes), used by various bits
84 * of the standalone code. This needs to go away someday.
86 #define DHCP_MAX_CID_LEN 64
89 * Generic DHCP option structure.
97 typedef union sockaddr46_s
{
98 struct sockaddr_in v4
;
99 struct sockaddr_in6 v6
;
103 * Generic DHCP packet list. Ensure that _REENTRANT bracketed code stays at
104 * bottom of this definition - the client doesn't include it. Scan.c in
105 * libdhcp isn't aware of it either...
107 * The PKT * pointer here actually points to a dhcpv6_message_t if the packet
108 * is DHCPv6. We assume that PKT * the same or stricter alignment
109 * requirements, and that the unused elements are not a significant burden.
111 #define MAX_PKT_LIST 5 /* maximum list size */
112 typedef struct dhcp_list
{
113 struct dhcp_list
*next
; /* keep first and in this */
114 struct dhcp_list
*prev
; /* order for insque/remque */
116 PKT
*pkt
; /* client packet */
117 uint_t len
; /* packet len */
118 int rfc1048
; /* RFC1048 options - boolean */
119 uint8_t offset
; /* BOOTP packet offset */
120 uint8_t isv6
; /* DHCPv6 packet - boolean */
122 * standard/site options
124 DHCP_OPT
*opts
[DHCP_LAST_OPT
+ 1];
127 * Vendor specific options (client only)
129 DHCP_OPT
*vs
[VS_OPTION_END
- VS_OPTION_START
+ 1];
131 struct in_addr off_ip
; /* Address OFFERed */
133 uint_t ifindex
; /* received ifindex (if any) */
134 sockaddr46_t pktfrom
; /* source (peer) address on input */
135 sockaddr46_t pktto
; /* destination (local) address */
139 extern int dhcp_options_scan(PKT_LIST
*, boolean_t
);
140 extern boolean_t
dhcp_getinfo_pl(PKT_LIST
*, uchar_t
, uint16_t, uint16_t,
142 extern dhcpv6_option_t
*dhcpv6_find_option(const void *, size_t,
143 const dhcpv6_option_t
*, uint16_t, uint_t
*);
144 extern dhcpv6_option_t
*dhcpv6_pkt_option(const PKT_LIST
*,
145 const dhcpv6_option_t
*, uint16_t, uint_t
*);
151 #endif /* _DHCP_IMPL_H */