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 (the "License").
6 * You may not use this file except in compliance with the License.
7 *
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.
12 *
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]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 * Copyright (c) 2016, Chris Fraire <cfraire@me.com>.
25 */
26
27 #ifndef _DHCP_IMPL_H
28 #define _DHCP_IMPL_H
29
30 #pragma ident "%Z%%M% %I% %E% SMI"
31
32 /*
33 * Common definitions used by Sun DHCP implementations
34 */
35
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39
40 #include <sys/types.h>
41 #include <sys/socket.h>
42 #include <netinet/in.h>
43 #include <netinet/udp.h>
44 #include <netinet/dhcp.h>
45 #include <netinet/dhcp6.h>
46 #include <dhcp_symbol_common.h>
47 #include <sys/sunos_dhcp_class.h>
48
49 /* Packet fields */
50 #define CD_PACKET_START 0
51 #define CD_POPCODE 0 /* packet opcode */
52 #define CD_PHTYPE 1 /* packet header type */
53 #define CD_PHLEN 2 /* packet header len */
54 #define CD_PHOPS 3 /* packet header len */
55 #define CD_PXID 4 /* packet hops */
56 #define CD_PSECS 8 /* packet xid */
57 #define CD_PFLAGS 10 /* packet secs */
58 #define CD_PCIADDR 12 /* packet flags */
59 #define CD_YIADDR 16 /* client's ip address */
60 #define CD_SIADDR 20 /* Bootserver's ip address */
61 #define CD_GIADDR 24 /* BOOTP relay agent address */
62 #define CD_PCHADDR 28 /* BOOTP relay agent address */
63 #define CD_SNAME 44 /* Hostname of Bootserver, or opts */
64 #define CD_BOOTFILE 108 /* File to boot or opts */
65 #define CD_PCOOKIE 236 /* packet cookie */
66 #define CD_POPTIONS 240 /* packet options */
67 #define CD_PACKET_END CD_POPTIONS
68
69 /* Internal server options */
70 #define CD_INTRNL_START 1024
71 #define CD_BOOL_HOSTNAME 1024 /* Entry wants hostname (Nameserv) */
72 #define CD_BOOL_LEASENEG 1025 /* Entry's lease is negotiable */
73 #define CD_BOOL_ECHO_VCLASS 1026 /* Echo Vendor class back to Entry */
74 #define CD_BOOTPATH 1027 /* prefix path to File to boot */
75 #define CD_INTRNL_END 1027
76
77 /* Error codes that could be generated while parsing packets */
78 #define DHCP_ERR_OFFSET 512
79 #define DHCP_GARBLED_MSG_TYPE (DHCP_ERR_OFFSET+0)
80 #define DHCP_WRONG_MSG_TYPE (DHCP_ERR_OFFSET+1)
81 #define DHCP_BAD_OPT_OVLD (DHCP_ERR_OFFSET+2)
82
83 /*
84 * Arbitrary "maximum" client ID length (in bytes), used by various bits
85 * of the standalone code. This needs to go away someday.
86 */
87 #define DHCP_MAX_CID_LEN 64
88
89 /*
90 * Generic DHCP option structure.
91 */
92 typedef struct {
93 uint8_t code;
94 uint8_t len;
95 uint8_t value[1];
96 } DHCP_OPT;
97
98 /*
99 * Defines the size of DHCP_OPT code + len
100 */
101 #define DHCP_OPT_META_LEN 2
102
103 typedef union sockaddr46_s {
104 struct sockaddr_in v4;
105 struct sockaddr_in6 v6;
106 } sockaddr46_t;
107
108 /*
109 * Generic DHCP packet list. Ensure that _REENTRANT bracketed code stays at
110 * bottom of this definition - the client doesn't include it. Scan.c in
111 * libdhcp isn't aware of it either...
112 *
113 * The PKT * pointer here actually points to a dhcpv6_message_t if the packet
114 * is DHCPv6. We assume that PKT * the same or stricter alignment
115 * requirements, and that the unused elements are not a significant burden.
116 */
117 #define MAX_PKT_LIST 5 /* maximum list size */
118 typedef struct dhcp_list {
119 struct dhcp_list *next; /* keep first and in this */
120 struct dhcp_list *prev; /* order for insque/remque */
121
122 PKT *pkt; /* client packet */
123 uint_t len; /* packet len */
124 int rfc1048; /* RFC1048 options - boolean */
125 uint8_t offset; /* BOOTP packet offset */
126 uint8_t isv6; /* DHCPv6 packet - boolean */
127 /*
128 * standard/site options
129 */
130 DHCP_OPT *opts[DHCP_LAST_OPT + 1];
131
132 /*
133 * Vendor specific options (client only)
134 */
135 DHCP_OPT *vs[VS_OPTION_END - VS_OPTION_START + 1];
136
137 struct in_addr off_ip; /* Address OFFERed */
138
139 uint_t ifindex; /* received ifindex (if any) */
140 sockaddr46_t pktfrom; /* source (peer) address on input */
141 sockaddr46_t pktto; /* destination (local) address */
142
143 } PKT_LIST;
144
145 extern int dhcp_options_scan(PKT_LIST *, boolean_t);
146 extern boolean_t dhcp_getinfo_pl(PKT_LIST *, uchar_t, uint16_t, uint16_t,
147 void *, size_t *);
148 extern dhcpv6_option_t *dhcpv6_find_option(const void *, size_t,
149 const dhcpv6_option_t *, uint16_t, uint_t *);
150 extern dhcpv6_option_t *dhcpv6_pkt_option(const PKT_LIST *,
151 const dhcpv6_option_t *, uint16_t, uint_t *);
152
153 #ifdef __cplusplus
154 }
155 #endif
156
157 #endif /* _DHCP_IMPL_H */