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#define DHCP_END 0xff
162
163
164#define OPT_CODE 0
165#define OPT_LEN 1
166#define OPT_DATA 2
167
168#define D6_OPT_CODE 0
169#define D6_OPT_LEN 2
170#define D6_OPT_DATA 4
171
172#define OPTION_FIELD 0
173#define FILE_FIELD 1
174#define SNAME_FIELD 2
175
176
177#define DHCPDISCOVER 1
178#define DHCPOFFER 2
179#define DHCPREQUEST 3
180#define DHCPDECLINE 4
181#define DHCPACK 5
182#define DHCPNAK 6
183#define DHCPRELEASE 7
184#define DHCPINFORM 8
185#define DHCP_MINTYPE DHCPDISCOVER
186#define DHCP_MAXTYPE DHCPINFORM
187
188struct dhcp_optflag {
189 uint8_t flags;
190 uint8_t code;
191};
192
193struct option_set {
194 uint8_t *data;
195 struct option_set *next;
196};
197
198#if ENABLE_UDHCPC || ENABLE_UDHCPD
199extern const struct dhcp_optflag dhcp_optflags[];
200extern const char dhcp_option_strings[] ALIGN1;
201#endif
202extern const uint8_t dhcp_option_lengths[] ALIGN1;
203
204unsigned FAST_FUNC udhcp_option_idx(const char *name, const char *option_strings);
205
206uint8_t *udhcp_get_option(struct dhcp_packet *packet, int code) FAST_FUNC;
207int udhcp_end_option(uint8_t *optionptr) FAST_FUNC;
208void udhcp_add_binary_option(struct dhcp_packet *packet, uint8_t *addopt) FAST_FUNC;
209#if ENABLE_UDHCPC || ENABLE_UDHCPD
210void udhcp_add_simple_option(struct dhcp_packet *packet, uint8_t code, uint32_t data) FAST_FUNC;
211#endif
212#if ENABLE_FEATURE_UDHCP_RFC3397 || ENABLE_FEATURE_UDHCPC6_RFC3646 || ENABLE_FEATURE_UDHCPC6_RFC4704
213char *dname_dec(const uint8_t *cstr, int clen, const char *pre) FAST_FUNC;
214uint8_t *dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen) FAST_FUNC;
215#endif
216struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code) FAST_FUNC;
217
218
219
220
221
222
223
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
267#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
268# define IF_UDHCP_VERBOSE(...) __VA_ARGS__
269extern unsigned dhcp_verbose;
270# define log1(...) do { if (dhcp_verbose >= 1) bb_error_msg(__VA_ARGS__); } while (0)
271# if CONFIG_UDHCP_DEBUG >= 2
272void udhcp_dump_packet(struct dhcp_packet *packet) FAST_FUNC;
273# define log2(...) do { if (dhcp_verbose >= 2) bb_error_msg(__VA_ARGS__); } while (0)
274# else
275# define udhcp_dump_packet(...) ((void)0)
276# define log2(...) ((void)0)
277# endif
278# if CONFIG_UDHCP_DEBUG >= 3
279# define log3(...) do { if (dhcp_verbose >= 3) bb_error_msg(__VA_ARGS__); } while (0)
280# else
281# define log3(...) ((void)0)
282# endif
283#else
284# define IF_UDHCP_VERBOSE(...)
285# define udhcp_dump_packet(...) ((void)0)
286# define log1(...) ((void)0)
287# define log2(...) ((void)0)
288# define log3(...) ((void)0)
289#endif
290
291
292
293
294
295int FAST_FUNC udhcp_str2nip(const char *str, void *arg);
296
297#if !ENABLE_UDHCPC6
298#define udhcp_str2optset(str, arg, optflags, option_strings, dhcpv6) \
299 udhcp_str2optset(str, arg, optflags, option_strings)
300#endif
301int FAST_FUNC udhcp_str2optset(const char *str,
302 void *arg,
303 const struct dhcp_optflag *optflags,
304 const char *option_strings,
305 bool dhcpv6);
306
307#if ENABLE_UDHCPC || ENABLE_UDHCPD
308void udhcp_init_header(struct dhcp_packet *packet, char type) FAST_FUNC;
309#endif
310
311int udhcp_recv_kernel_packet(struct dhcp_packet *packet, int fd) FAST_FUNC;
312
313int udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
314 uint32_t source_nip, int source_port,
315 uint32_t dest_nip, int dest_port, const uint8_t *dest_arp,
316 int ifindex) FAST_FUNC;
317
318int udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
319 uint32_t source_nip, int source_port,
320 uint32_t dest_nip, int dest_port) FAST_FUNC;
321
322void udhcp_sp_setup(void) FAST_FUNC;
323void udhcp_sp_fd_set(struct pollfd *pfds, int extra_fd) FAST_FUNC;
324int udhcp_sp_read(void) FAST_FUNC;
325
326int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) FAST_FUNC;
327
328int udhcp_listen_socket( int port, const char *inf) FAST_FUNC;
329
330
331int arpping(uint32_t test_nip,
332 const uint8_t *safe_mac,
333 uint32_t from_ip,
334 uint8_t *from_mac,
335 const char *interface,
336 unsigned timeo) FAST_FUNC;
337
338
339int sprint_nip6(char *dest, const uint8_t *ip) FAST_FUNC;
340
341POP_SAVED_FUNCTION_VISIBILITY
342
343#endif
344