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#define DHCP_VLAN_ID 0x84
153#define DHCP_VLAN_PRIORITY 0x85
154
155
156#define DHCP_END 0xff
157
158
159#define OPT_CODE 0
160#define OPT_LEN 1
161#define OPT_DATA 2
162
163#define OPTION_FIELD 0
164#define FILE_FIELD 1
165#define SNAME_FIELD 2
166
167
168#define DHCPDISCOVER 1
169#define DHCPOFFER 2
170#define DHCPREQUEST 3
171#define DHCPDECLINE 4
172#define DHCPACK 5
173#define DHCPNAK 6
174#define DHCPRELEASE 7
175#define DHCPINFORM 8
176#define DHCP_MINTYPE DHCPDISCOVER
177#define DHCP_MAXTYPE DHCPINFORM
178
179struct dhcp_optflag {
180 uint8_t flags;
181 uint8_t code;
182};
183
184struct option_set {
185 uint8_t *data;
186 struct option_set *next;
187};
188
189extern const struct dhcp_optflag dhcp_optflags[];
190extern const char dhcp_option_strings[] ALIGN1;
191extern const uint8_t dhcp_option_lengths[] ALIGN1;
192
193unsigned FAST_FUNC udhcp_option_idx(const char *name);
194
195uint8_t *udhcp_get_option(struct dhcp_packet *packet, int code) FAST_FUNC;
196int udhcp_end_option(uint8_t *optionptr) FAST_FUNC;
197void udhcp_add_binary_option(struct dhcp_packet *packet, uint8_t *addopt) FAST_FUNC;
198void udhcp_add_simple_option(struct dhcp_packet *packet, uint8_t code, uint32_t data) FAST_FUNC;
199#if ENABLE_FEATURE_UDHCP_RFC3397
200char *dname_dec(const uint8_t *cstr, int clen, const char *pre) FAST_FUNC;
201uint8_t *dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen) FAST_FUNC;
202#endif
203struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code) FAST_FUNC;
204
205
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#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
255# define IF_UDHCP_VERBOSE(...) __VA_ARGS__
256extern unsigned dhcp_verbose;
257# define log1(...) do { if (dhcp_verbose >= 1) bb_info_msg(__VA_ARGS__); } while (0)
258# if CONFIG_UDHCP_DEBUG >= 2
259void udhcp_dump_packet(struct dhcp_packet *packet) FAST_FUNC;
260# define log2(...) do { if (dhcp_verbose >= 2) bb_info_msg(__VA_ARGS__); } while (0)
261# else
262# define udhcp_dump_packet(...) ((void)0)
263# define log2(...) ((void)0)
264# endif
265# if CONFIG_UDHCP_DEBUG >= 3
266# define log3(...) do { if (dhcp_verbose >= 3) bb_info_msg(__VA_ARGS__); } while (0)
267# else
268# define log3(...) ((void)0)
269# endif
270#else
271# define IF_UDHCP_VERBOSE(...)
272# define udhcp_dump_packet(...) ((void)0)
273# define log1(...) ((void)0)
274# define log2(...) ((void)0)
275# define log3(...) ((void)0)
276#endif
277
278
279
280
281
282int FAST_FUNC udhcp_str2nip(const char *str, void *arg);
283
284int FAST_FUNC udhcp_str2optset(const char *str, void *arg);
285
286void udhcp_init_header(struct dhcp_packet *packet, char type) FAST_FUNC;
287
288int udhcp_recv_kernel_packet(struct dhcp_packet *packet, int fd) FAST_FUNC;
289
290int udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
291 uint32_t source_nip, int source_port,
292 uint32_t dest_nip, int dest_port, const uint8_t *dest_arp,
293 int ifindex) FAST_FUNC;
294
295int udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
296 uint32_t source_nip, int source_port,
297 uint32_t dest_nip, int dest_port) FAST_FUNC;
298
299void udhcp_sp_setup(void) FAST_FUNC;
300int udhcp_sp_fd_set(fd_set *rfds, int extra_fd) FAST_FUNC;
301int udhcp_sp_read(const fd_set *rfds) FAST_FUNC;
302
303int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) FAST_FUNC;
304
305int udhcp_listen_socket( int port, const char *inf) FAST_FUNC;
306
307
308int arpping(uint32_t test_nip,
309 const uint8_t *safe_mac,
310 uint32_t from_ip,
311 uint8_t *from_mac,
312 const char *interface) FAST_FUNC;
313
314
315int sprint_nip6(char *dest, const uint8_t *ip) FAST_FUNC;
316
317POP_SAVED_FUNCTION_VISIBILITY
318
319#endif
320