xref: /openbsd/usr.sbin/dhcrelay/dhcpd.h (revision ce7279d8)
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 *
ss2sin(struct sockaddr_storage * ss)182 ss2sin(struct sockaddr_storage *ss)
183 {
184 	return ((struct sockaddr_in *)ss);
185 }
186 
187 static inline struct sockaddr_in6 *
ss2sin6(struct sockaddr_storage * ss)188 ss2sin6(struct sockaddr_storage *ss)
189 {
190 	return ((struct sockaddr_in6 *)ss);
191 }
192