1 /* $OpenBSD: dhcpd.h,v 1.24 2024/05/21 05:00:48 jsg Exp $ */ 2 3 /* 4 * Copyright (c) 2004 Henning Brauer <henning@openbsd.org> 5 * Copyright (c) 1995, 1996, 1997, 1998, 1999 6 * The Internet Software Consortium. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. Neither the name of The Internet Software Consortium nor the names 18 * of its contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND 22 * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 23 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 24 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 25 * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR 26 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 29 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 30 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 31 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 32 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * This software has been written for the Internet Software Consortium 36 * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie 37 * Enterprises. To learn more about the Internet Software Consortium, 38 * see ``http://www.vix.com/isc''. To learn more about Vixie 39 * Enterprises, see ``http://www.vix.com''. 40 */ 41 42 #include <sys/queue.h> 43 44 #define SERVER_PORT 67 45 #define CLIENT_PORT 68 46 47 /* Maximum size of client hardware address. */ 48 #define CHADDR_SIZE 16 49 50 struct packet_ctx { 51 uint8_t pc_htype; 52 uint8_t pc_hlen; 53 uint8_t pc_smac[CHADDR_SIZE]; 54 uint8_t pc_dmac[CHADDR_SIZE]; 55 56 struct sockaddr_storage pc_src; 57 struct sockaddr_storage pc_dst; 58 59 const char *pc_circuit; 60 int pc_circuitlen; 61 const char *pc_remote; 62 int pc_remotelen; 63 }; 64 65 struct iaddr { 66 int len; 67 unsigned char iabuf[CHADDR_SIZE]; 68 }; 69 70 struct hardware { 71 u_int8_t htype; 72 u_int8_t hlen; 73 u_int8_t haddr[CHADDR_SIZE]; 74 }; 75 76 /* Possible states in which the client can be. */ 77 enum dhcp_state { 78 S_REBOOTING, 79 S_INIT, 80 S_SELECTING, 81 S_REQUESTING, 82 S_BOUND, 83 S_RENEWING, 84 S_REBINDING 85 }; 86 87 /* DHCP relaying modes. */ 88 enum dhcp_relay_mode { 89 DRM_UNKNOWN, 90 DRM_LAYER2, 91 DRM_LAYER3, 92 }; 93 94 struct interface_info { 95 struct hardware hw_address; 96 struct in_addr primary_address; 97 char name[IFNAMSIZ]; 98 int rfdesc; 99 int wfdesc; 100 unsigned char *rbuf; 101 size_t rbuf_max; 102 size_t rbuf_offset; 103 size_t rbuf_len; 104 struct ifreq ifr; 105 int noifmedia; 106 int errors; 107 int dead; 108 u_int16_t index; 109 110 int ipv6; /* Has any IPv6 address. */ 111 int gipv6; /* Has global IPv6 address. */ 112 struct in6_addr linklocal; /* IPv6 link-local address. */ 113 114 TAILQ_ENTRY(interface_info) entry; 115 }; 116 TAILQ_HEAD(iflist, interface_info); 117 118 struct timeout { 119 struct timeout *next; 120 time_t when; 121 void (*func)(void *); 122 void *what; 123 }; 124 125 struct protocol { 126 struct protocol *next; 127 int fd; 128 void (*handler)(struct protocol *); 129 void *local; 130 }; 131 132 struct server_list { 133 struct interface_info *intf; 134 struct server_list *next; 135 struct sockaddr_storage to; 136 int fd; 137 }; 138 139 #define DHCPD_LOG_FACILITY LOG_DAEMON 140 141 /* External definitions... */ 142 143 /* bpf.c */ 144 int if_register_bpf(struct interface_info *); 145 void if_register_send(struct interface_info *); 146 void if_register_receive(struct interface_info *, int); 147 ssize_t send_packet(struct interface_info *, 148 struct dhcp_packet *, size_t, struct packet_ctx *); 149 ssize_t receive_packet(struct interface_info *, unsigned char *, size_t, 150 struct packet_ctx *); 151 152 /* dispatch.c */ 153 extern void (*bootp_packet_handler)(struct interface_info *, 154 struct dhcp_packet *, int, struct packet_ctx *); 155 struct interface_info *iflist_getbyname(const char *); 156 void setup_iflist(void); 157 struct interface_info *register_interface(const char *, 158 void (*)(struct protocol *), int isserver); 159 void dispatch(void); 160 void got_one(struct protocol *); 161 void add_protocol(char *, int, void (*)(struct protocol *), void *); 162 void remove_protocol(struct protocol *); 163 164 /* packet.c */ 165 ssize_t assemble_hw_header(unsigned char *, size_t, size_t, 166 struct packet_ctx *, unsigned int); 167 ssize_t assemble_udp_ip_header(unsigned char *, size_t, size_t, 168 struct packet_ctx *pc, unsigned char *, size_t); 169 ssize_t decode_hw_header(unsigned char *, size_t, size_t, struct packet_ctx *, 170 unsigned int); 171 ssize_t decode_udp_ip_header(unsigned char *, size_t, size_t, 172 struct packet_ctx *); 173 174 /* dhcrelay.c */ 175 extern int server_fd; 176 extern struct iflist intflist; 177 178 /* crap */ 179 extern time_t cur_time; 180 181 static inline struct sockaddr_in * 182 ss2sin(struct sockaddr_storage *ss) 183 { 184 return ((struct sockaddr_in *)ss); 185 } 186 187 static inline struct sockaddr_in6 * 188 ss2sin6(struct sockaddr_storage *ss) 189 { 190 return ((struct sockaddr_in6 *)ss); 191 } 192