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 */ 25 26 #ifndef _DHCP_IMPL_H 27 #define _DHCP_IMPL_H 28 29 #pragma ident "%Z%%M% %I% %E% SMI" 30 31 /* 32 * Common definitions used by Sun DHCP implementations 33 */ 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 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> 47 48 /* Packet fields */ 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 67 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 75 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) 81 82 /* 83 * Arbitrary "maximum" client ID length (in bytes), used by various bits 84 * of the standalone code. This needs to go away someday. 85 */ 86 #define DHCP_MAX_CID_LEN 64 87 88 /* 89 * Generic DHCP option structure. 90 */ 91 typedef struct { 92 uint8_t code; 93 uint8_t len; 94 uint8_t value[1]; 95 } DHCP_OPT; 96 97 typedef union sockaddr46_s { 98 struct sockaddr_in v4; 99 struct sockaddr_in6 v6; 100 } sockaddr46_t; 101 102 /* 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... 106 * 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. 110 */ 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 */ 115 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 */ 121 /* 122 * standard/site options 123 */ 124 DHCP_OPT *opts[DHCP_LAST_OPT + 1]; 125 126 /* 127 * Vendor specific options (client only) 128 */ 129 DHCP_OPT *vs[VS_OPTION_END - VS_OPTION_START + 1]; 130 131 struct in_addr off_ip; /* Address OFFERed */ 132 133 uint_t ifindex; /* received ifindex (if any) */ 134 sockaddr46_t pktfrom; /* source (peer) address on input */ 135 sockaddr46_t pktto; /* destination (local) address */ 136 137 } PKT_LIST; 138 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, 141 void *, size_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 *); 146 147 #ifdef __cplusplus 148 } 149 #endif 150 151 #endif /* _DHCP_IMPL_H */ 152