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