1
2
3
4
5
6
7
8#ifndef UDHCP_COMMON_H
9#define UDHCP_COMMON_H 1
10
11#include "libbb.h"
12#include "common_bufsiz.h"
13#include <netinet/udp.h>
14#include <netinet/ip.h>
15
16PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
17
18extern const uint8_t MAC_BCAST_ADDR[6] ALIGN2;
19
20
21
22
23
24#define DHCP_MAGIC 0x63825363
25#define DHCP_OPTIONS_BUFSIZE 308
26#define BOOTREQUEST 1
27#define BOOTREPLY 2
28
29
30struct dhcp_packet {
31 uint8_t op;
32 uint8_t htype;
33 uint8_t hlen;
34 uint8_t hops;
35 uint32_t xid;
36 uint16_t secs;
37 uint16_t flags;
38#define BROADCAST_FLAG 0x8000
39 uint32_t ciaddr;
40 uint32_t yiaddr;
41
42 uint32_t siaddr_nip;
43 uint32_t gateway_nip;
44 uint8_t chaddr[16];
45 uint8_t sname[64];
46 uint8_t file[128];
47 uint32_t cookie;
48 uint8_t options[DHCP_OPTIONS_BUFSIZE + CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS];
49} PACKED;
50#define DHCP_PKT_SNAME_LEN 64
51#define DHCP_PKT_FILE_LEN 128
52#define DHCP_PKT_SNAME_LEN_STR "64"
53#define DHCP_PKT_FILE_LEN_STR "128"
54
55struct ip_udp_dhcp_packet {
56 struct iphdr ip;
57 struct udphdr udp;
58 struct dhcp_packet data;
59} PACKED;
60
61struct udp_dhcp_packet {
62 struct udphdr udp;
63 struct dhcp_packet data;
64} PACKED;
65
66enum {
67 IP_UDP_DHCP_SIZE = sizeof(struct ip_udp_dhcp_packet) - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS,
68 UDP_DHCP_SIZE = sizeof(struct udp_dhcp_packet) - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS,
69 DHCP_SIZE = sizeof(struct dhcp_packet) - CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS,
70};
71
72
73struct BUG_bad_sizeof_struct_ip_udp_dhcp_packet {
74 char c[IP_UDP_DHCP_SIZE == 576 ? 1 : -1];
75};
76
77
78
79
80enum {
81 OPTION_IP = 1,
82 OPTION_IP_PAIR,
83 OPTION_STRING,
84
85
86 OPTION_STRING_HOST,
87
88 OPTION_U8,
89 OPTION_U16,
90
91 OPTION_U32,
92 OPTION_S32,
93 OPTION_BIN,
94 OPTION_STATIC_ROUTES,
95 OPTION_6RD,
96#if ENABLE_FEATURE_UDHCP_RFC3397 || ENABLE_FEATURE_UDHCPC6_RFC3646 || ENABLE_FEATURE_UDHCPC6_RFC4704
97 OPTION_DNS_STRING,
98#endif
99#if ENABLE_FEATURE_UDHCP_RFC3397
100 OPTION_SIP_SERVERS,
101#endif
102
103 OPTION_TYPE_MASK = 0x0f,
104
105 OPTION_REQ = 0x10,
106
107 OPTION_LIST = 0x20,
108};
109
110
111
112
113
114
115#define DHCP_PADDING 0x00
116#define DHCP_SUBNET 0x01
117
118
119
120
121
122
123
124
125#define DHCP_HOST_NAME 0x0c
126
127
128
129
130
131
132
133
134
135
136
137
138#define DHCP_REQUESTED_IP 0x32
139#define DHCP_LEASE_TIME 0x33
140#define DHCP_OPTION_OVERLOAD 0x34
141#define DHCP_MESSAGE_TYPE 0x35
142#define DHCP_SERVER_ID 0x36
143#define DHCP_PARAM_REQ 0x37
144
145#define DHCP_MAX_SIZE 0x39
146#define DHCP_VENDOR 0x3c
147#define DHCP_CLIENT_ID 0x3d
148
149
150
151#define DHCP_FQDN 0x51
152
153
154
155
156
157
158
159
160
161
162
163
164#define DHCP_END 0xff
165
166
167#define OPT_CODE 0
168#define OPT_LEN 1
169#define OPT_DATA 2
170
171#define D6_OPT_CODE 0
172#define D6_OPT_LEN 2
173#define D6_OPT_DATA 4
174
175#define OPTION_FIELD 0
176#define FILE_FIELD 1
177#define SNAME_FIELD 2
178
179
180#define DHCPDISCOVER 1
181#define DHCPOFFER 2
182#define DHCPREQUEST 3
183#define DHCPDECLINE 4
184#define DHCPACK 5
185#define DHCPNAK 6
186#define DHCPRELEASE 7
187#define DHCPINFORM 8
188#define DHCP_MINTYPE DHCPDISCOVER
189#define DHCP_MAXTYPE DHCPINFORM
190
191struct dhcp_optflag {
192 uint8_t flags;
193 uint8_t code;
194};
195
196struct option_set {
197 uint8_t *data;
198 struct option_set *next;
199};
200
201#if ENABLE_UDHCPC || ENABLE_UDHCPD
202extern const struct dhcp_optflag dhcp_optflags[];
203extern const char dhcp_option_strings[] ALIGN1;
204#endif
205extern const uint8_t dhcp_option_lengths[] ALIGN1;
206
207unsigned FAST_FUNC udhcp_option_idx(const char *name, const char *option_strings);
208
209uint8_t *udhcp_get_option(struct dhcp_packet *packet, int code) FAST_FUNC;
210
211
212
213uint8_t *udhcp_get_option32(struct dhcp_packet *packet, int code) FAST_FUNC;
214int udhcp_end_option(uint8_t *optionptr) FAST_FUNC;
215void udhcp_add_binary_option(struct dhcp_packet *packet, uint8_t *addopt) FAST_FUNC;
216#if ENABLE_UDHCPC || ENABLE_UDHCPD
217void udhcp_add_simple_option(struct dhcp_packet *packet, uint8_t code, uint32_t data) FAST_FUNC;
218#endif
219#if ENABLE_FEATURE_UDHCP_RFC3397 || ENABLE_FEATURE_UDHCPC6_RFC3646 || ENABLE_FEATURE_UDHCPC6_RFC4704
220char *dname_dec(const uint8_t *cstr, int clen, const char *pre) FAST_FUNC;
221uint8_t *dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen) FAST_FUNC;
222#endif
223struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code) FAST_FUNC;
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
267# define IF_UDHCP_VERBOSE(...) __VA_ARGS__
268extern unsigned dhcp_verbose;
269# define log1(...) do { if (dhcp_verbose >= 1) bb_info_msg(__VA_ARGS__); } while (0)
270# if CONFIG_UDHCP_DEBUG >= 2
271void udhcp_dump_packet(struct dhcp_packet *packet) FAST_FUNC;
272# define log2(...) do { if (dhcp_verbose >= 2) bb_info_msg(__VA_ARGS__); } while (0)
273# else
274# define udhcp_dump_packet(...) ((void)0)
275# define log2(...) ((void)0)
276# endif
277# if CONFIG_UDHCP_DEBUG >= 3
278# define log3(...) do { if (dhcp_verbose >= 3) bb_info_msg(__VA_ARGS__); } while (0)
279# else
280# define log3(...) ((void)0)
281# endif
282#else
283# define IF_UDHCP_VERBOSE(...)
284# define udhcp_dump_packet(...) ((void)0)
285# define log1(...) ((void)0)
286# define log2(...) ((void)0)
287# define log3(...) ((void)0)
288#endif
289
290
291
292
293
294int FAST_FUNC udhcp_str2nip(const char *str, void *arg);
295
296#if !ENABLE_UDHCPC6
297#define udhcp_str2optset(str, arg, optflags, option_strings, dhcpv6) \
298 udhcp_str2optset(str, arg, optflags, option_strings)
299#endif
300int FAST_FUNC udhcp_str2optset(const char *str,
301 void *arg,
302 const struct dhcp_optflag *optflags,
303 const char *option_strings,
304 bool dhcpv6);
305
306#if ENABLE_UDHCPC || ENABLE_UDHCPD
307void udhcp_init_header(struct dhcp_packet *packet, char type) FAST_FUNC;
308#endif
309
310int udhcp_recv_kernel_packet(struct dhcp_packet *packet, int fd) FAST_FUNC;
311
312int udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
313 uint32_t source_nip, int source_port,
314 uint32_t dest_nip, int dest_port, const uint8_t *dest_arp,
315 int ifindex) FAST_FUNC;
316
317int udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
318 uint32_t source_nip, int source_port,
319 uint32_t dest_nip, int dest_port) FAST_FUNC;
320
321void udhcp_sp_setup(void) FAST_FUNC;
322void udhcp_sp_fd_set(struct pollfd *pfds, int extra_fd) FAST_FUNC;
323int udhcp_sp_read(void) FAST_FUNC;
324
325int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) FAST_FUNC;
326
327int udhcp_listen_socket( int port, const char *inf) FAST_FUNC;
328
329
330int arpping(uint32_t test_nip,
331 const uint8_t *safe_mac,
332 uint32_t from_ip,
333 uint8_t *from_mac,
334 const char *interface,
335 unsigned timeo) FAST_FUNC;
336
337
338int sprint_nip6(char *dest, const uint8_t *ip) FAST_FUNC;
339
340POP_SAVED_FUNCTION_VISIBILITY
341
342#endif
343