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