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