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];
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 OPTION_U8,
85 OPTION_U16,
86
87 OPTION_U32,
88 OPTION_S32,
89 OPTION_BIN,
90 OPTION_STATIC_ROUTES,
91#if ENABLE_FEATURE_UDHCP_RFC3397
92 OPTION_DNS_STRING,
93 OPTION_SIP_SERVERS,
94#endif
95
96 OPTION_TYPE_MASK = 0x0f,
97
98 OPTION_REQ = 0x10,
99
100 OPTION_LIST = 0x20,
101};
102
103
104
105
106
107
108#define DHCP_PADDING 0x00
109#define DHCP_SUBNET 0x01
110
111
112
113
114
115
116
117
118#define DHCP_HOST_NAME 0x0c
119
120
121
122
123
124
125
126
127
128
129
130
131#define DHCP_REQUESTED_IP 0x32
132#define DHCP_LEASE_TIME 0x33
133#define DHCP_OPTION_OVERLOAD 0x34
134#define DHCP_MESSAGE_TYPE 0x35
135#define DHCP_SERVER_ID 0x36
136#define DHCP_PARAM_REQ 0x37
137
138#define DHCP_MAX_SIZE 0x39
139#define DHCP_VENDOR 0x3c
140#define DHCP_CLIENT_ID 0x3d
141
142
143
144#define DHCP_FQDN 0x51
145
146
147
148
149
150#define DHCP_END 0xff
151
152
153#define OPT_CODE 0
154#define OPT_LEN 1
155#define OPT_DATA 2
156
157#define OPTION_FIELD 0
158#define FILE_FIELD 1
159#define SNAME_FIELD 2
160
161
162#define DHCPDISCOVER 1
163#define DHCPOFFER 2
164#define DHCPREQUEST 3
165#define DHCPDECLINE 4
166#define DHCPACK 5
167#define DHCPNAK 6
168#define DHCPRELEASE 7
169#define DHCPINFORM 8
170#define DHCP_MINTYPE DHCPDISCOVER
171#define DHCP_MAXTYPE DHCPINFORM
172
173struct dhcp_optflag {
174 uint8_t flags;
175 uint8_t code;
176};
177
178struct option_set {
179 uint8_t *data;
180 struct option_set *next;
181};
182
183extern const struct dhcp_optflag dhcp_optflags[];
184extern const char dhcp_option_strings[];
185extern const uint8_t dhcp_option_lengths[];
186
187unsigned FAST_FUNC udhcp_option_idx(const char *name);
188
189uint8_t *udhcp_get_option(struct dhcp_packet *packet, int code) FAST_FUNC;
190int udhcp_end_option(uint8_t *optionptr) FAST_FUNC;
191void udhcp_add_binary_option(struct dhcp_packet *packet, uint8_t *addopt) FAST_FUNC;
192void udhcp_add_simple_option(struct dhcp_packet *packet, uint8_t code, uint32_t data) FAST_FUNC;
193#if ENABLE_FEATURE_UDHCP_RFC3397
194char *dname_dec(const uint8_t *cstr, int clen, const char *pre) FAST_FUNC;
195uint8_t *dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen) FAST_FUNC;
196#endif
197struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code) FAST_FUNC;
198
199
200
201
202
203
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#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
249extern unsigned dhcp_verbose;
250# define log1(...) do { if (dhcp_verbose >= 1) bb_info_msg(__VA_ARGS__); } while (0)
251# if CONFIG_UDHCP_DEBUG >= 2
252void udhcp_dump_packet(struct dhcp_packet *packet) FAST_FUNC;
253# define log2(...) do { if (dhcp_verbose >= 2) bb_info_msg(__VA_ARGS__); } while (0)
254# else
255# define udhcp_dump_packet(...) ((void)0)
256# define log2(...) ((void)0)
257# endif
258# if CONFIG_UDHCP_DEBUG >= 3
259# define log3(...) do { if (dhcp_verbose >= 3) bb_info_msg(__VA_ARGS__); } while (0)
260# else
261# define log3(...) ((void)0)
262# endif
263#else
264# define udhcp_dump_packet(...) ((void)0)
265# define log1(...) ((void)0)
266# define log2(...) ((void)0)
267# define log3(...) ((void)0)
268#endif
269
270
271
272
273
274int FAST_FUNC udhcp_str2nip(const char *str, void *arg);
275
276int FAST_FUNC udhcp_str2optset(const char *str, void *arg);
277
278uint16_t udhcp_checksum(void *addr, int count) FAST_FUNC;
279
280void udhcp_init_header(struct dhcp_packet *packet, char type) FAST_FUNC;
281
282int udhcp_recv_kernel_packet(struct dhcp_packet *packet, int fd) FAST_FUNC;
283
284int udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
285 uint32_t source_nip, int source_port,
286 uint32_t dest_nip, int dest_port, const uint8_t *dest_arp,
287 int ifindex) FAST_FUNC;
288
289int udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
290 uint32_t source_nip, int source_port,
291 uint32_t dest_nip, int dest_port) FAST_FUNC;
292
293void udhcp_sp_setup(void) FAST_FUNC;
294int udhcp_sp_fd_set(fd_set *rfds, int extra_fd) FAST_FUNC;
295int udhcp_sp_read(const fd_set *rfds) FAST_FUNC;
296
297int udhcp_read_interface(const char *interface, int *ifindex, uint32_t *nip, uint8_t *mac) FAST_FUNC;
298
299int udhcp_listen_socket( int port, const char *inf) FAST_FUNC;
300
301
302int arpping(uint32_t test_nip,
303 const uint8_t *safe_mac,
304 uint32_t from_ip,
305 uint8_t *from_mac,
306 const char *interface) FAST_FUNC;
307
308POP_SAVED_FUNCTION_VISIBILITY
309
310#endif
311