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