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