aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-06-17 11:54:52 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-06-17 11:54:52 +0200
commitac906fa85e61b4e34161709de777616f858bc945 (patch)
tree7b247714814fd9dcf3fd3dccf954521b29eef5a2
parented8982bfc0e9895fe707a5f6152cf184e06f2052 (diff)
downloadbusybox-w32-ac906fa85e61b4e34161709de777616f858bc945.tar.gz
busybox-w32-ac906fa85e61b4e34161709de777616f858bc945.tar.bz2
busybox-w32-ac906fa85e61b4e34161709de777616f858bc945.zip
udhcp: change UDHCP_DEBUG into int, make verbosity selectable with -v
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/udhcp/Config.in16
-rw-r--r--networking/udhcp/arpping.c2
-rw-r--r--networking/udhcp/clientpacket.c23
-rw-r--r--networking/udhcp/clientsocket.c8
-rw-r--r--networking/udhcp/common.c5
-rw-r--r--networking/udhcp/common.h22
-rw-r--r--networking/udhcp/dhcpc.c56
-rw-r--r--networking/udhcp/dhcpc.h9
-rw-r--r--networking/udhcp/dhcpd.c28
-rw-r--r--networking/udhcp/dhcpd.h1
-rw-r--r--networking/udhcp/files.c17
-rw-r--r--networking/udhcp/options.c2
-rw-r--r--networking/udhcp/packet.c76
-rw-r--r--networking/udhcp/script.c2
-rw-r--r--networking/udhcp/serverpacket.c44
-rw-r--r--networking/udhcp/socket.c8
16 files changed, 197 insertions, 122 deletions
diff --git a/networking/udhcp/Config.in b/networking/udhcp/Config.in
index 495b07941..a31240a45 100644
--- a/networking/udhcp/Config.in
+++ b/networking/udhcp/Config.in
@@ -74,15 +74,17 @@ config FEATURE_UDHCP_PORT
74 At the cost of ~300 bytes, enables -P port option. 74 At the cost of ~300 bytes, enables -P port option.
75 This feature is typically not needed. 75 This feature is typically not needed.
76 76
77# TODO: UDHCP_DEBUG is inconvenient to use.
78# Make it controllable at runtime (say, via -v, -vv, -vvv)
79
80config UDHCP_DEBUG 77config UDHCP_DEBUG
81 bool "Compile udhcp with noisy debugging messages" 78 int "Maximum verbosity level for udhcp applets (0..3)"
82 default n 79 default 0
83 depends on APP_UDHCPD || APP_UDHCPC 80 range 0 3
81 depends on APP_UDHCPD || APP_UDHCPC || APP_DHCPRELAY
84 help 82 help
85 If selected, udhcpd will output extra debugging output. 83 Verbosity can be increased with multiple -v options.
84 This options controls how high it can be cranked up.
85
86 Bigger values result in bigger code. Levels above 1
87 are very verbose and useful for debugging only.
86 88
87config FEATURE_UDHCP_RFC3397 89config FEATURE_UDHCP_RFC3397
88 bool "Support for RFC3397 domain search (experimental)" 90 bool "Support for RFC3397 domain search (experimental)"
diff --git a/networking/udhcp/arpping.c b/networking/udhcp/arpping.c
index fa0989d0f..47a7b1351 100644
--- a/networking/udhcp/arpping.c
+++ b/networking/udhcp/arpping.c
@@ -128,6 +128,6 @@ int FAST_FUNC arpping(uint32_t test_ip,
128 128
129 ret: 129 ret:
130 close(s); 130 close(s);
131 DEBUG("%srp reply received for this address", rv ? "No a" : "A"); 131 log1("%srp reply received for this address", rv ? "No a" : "A");
132 return rv; 132 return rv;
133} 133}
diff --git a/networking/udhcp/clientpacket.c b/networking/udhcp/clientpacket.c
index 068f947cc..7d44697ec 100644
--- a/networking/udhcp/clientpacket.c
+++ b/networking/udhcp/clientpacket.c
@@ -203,7 +203,7 @@ int FAST_FUNC send_release(uint32_t server, uint32_t ciaddr)
203 203
204 204
205/* Returns -1 on errors that are fatal for the socket, -2 for those that aren't */ 205/* Returns -1 on errors that are fatal for the socket, -2 for those that aren't */
206int FAST_FUNC udhcp_recv_raw_packet(struct dhcpMessage *payload, int fd) 206int FAST_FUNC udhcp_recv_raw_packet(struct dhcpMessage *dhcp_pkt, int fd)
207{ 207{
208 int bytes; 208 int bytes;
209 struct udp_dhcp_packet packet; 209 struct udp_dhcp_packet packet;
@@ -212,19 +212,19 @@ int FAST_FUNC udhcp_recv_raw_packet(struct dhcpMessage *payload, int fd)
212 memset(&packet, 0, sizeof(packet)); 212 memset(&packet, 0, sizeof(packet));
213 bytes = safe_read(fd, &packet, sizeof(packet)); 213 bytes = safe_read(fd, &packet, sizeof(packet));
214 if (bytes < 0) { 214 if (bytes < 0) {
215 DEBUG("Cannot read on raw listening socket - ignoring"); 215 log1("Packet read error, ignoring");
216 /* NB: possible down interface, etc. Caller should pause. */ 216 /* NB: possible down interface, etc. Caller should pause. */
217 return bytes; /* returns -1 */ 217 return bytes; /* returns -1 */
218 } 218 }
219 219
220 if (bytes < (int) (sizeof(packet.ip) + sizeof(packet.udp))) { 220 if (bytes < (int) (sizeof(packet.ip) + sizeof(packet.udp))) {
221 DEBUG("Packet is too short, ignoring"); 221 log1("Packet is too short, ignoring");
222 return -2; 222 return -2;
223 } 223 }
224 224
225 if (bytes < ntohs(packet.ip.tot_len)) { 225 if (bytes < ntohs(packet.ip.tot_len)) {
226 /* packet is bigger than sizeof(packet), we did partial read */ 226 /* packet is bigger than sizeof(packet), we did partial read */
227 DEBUG("Oversized packet, ignoring"); 227 log1("Oversized packet, ignoring");
228 return -2; 228 return -2;
229 } 229 }
230 230
@@ -238,7 +238,7 @@ int FAST_FUNC udhcp_recv_raw_packet(struct dhcpMessage *payload, int fd)
238 /* || bytes > (int) sizeof(packet) - can't happen */ 238 /* || bytes > (int) sizeof(packet) - can't happen */
239 || ntohs(packet.udp.len) != (uint16_t)(bytes - sizeof(packet.ip)) 239 || ntohs(packet.udp.len) != (uint16_t)(bytes - sizeof(packet.ip))
240 ) { 240 ) {
241 DEBUG("Unrelated/bogus packet"); 241 log1("Unrelated/bogus packet, ignoring");
242 return -2; 242 return -2;
243 } 243 }
244 244
@@ -246,7 +246,7 @@ int FAST_FUNC udhcp_recv_raw_packet(struct dhcpMessage *payload, int fd)
246 check = packet.ip.check; 246 check = packet.ip.check;
247 packet.ip.check = 0; 247 packet.ip.check = 0;
248 if (check != udhcp_checksum(&packet.ip, sizeof(packet.ip))) { 248 if (check != udhcp_checksum(&packet.ip, sizeof(packet.ip))) {
249 DEBUG("Bad IP header checksum, ignoring"); 249 log1("Bad IP header checksum, ignoring");
250 return -2; 250 return -2;
251 } 251 }
252 252
@@ -257,16 +257,17 @@ int FAST_FUNC udhcp_recv_raw_packet(struct dhcpMessage *payload, int fd)
257 check = packet.udp.check; 257 check = packet.udp.check;
258 packet.udp.check = 0; 258 packet.udp.check = 0;
259 if (check && check != udhcp_checksum(&packet, bytes)) { 259 if (check && check != udhcp_checksum(&packet, bytes)) {
260 bb_error_msg("packet with bad UDP checksum received, ignoring"); 260 log1("Packet with bad UDP checksum received, ignoring");
261 return -2; 261 return -2;
262 } 262 }
263 263
264 memcpy(payload, &packet.data, bytes - (sizeof(packet.ip) + sizeof(packet.udp))); 264 memcpy(dhcp_pkt, &packet.data, bytes - (sizeof(packet.ip) + sizeof(packet.udp)));
265 265
266 if (payload->cookie != htonl(DHCP_MAGIC)) { 266 if (dhcp_pkt->cookie != htonl(DHCP_MAGIC)) {
267 bb_error_msg("received bogus message (bad magic), ignoring"); 267 bb_info_msg("Packet with bad magic, ignoring");
268 return -2; 268 return -2;
269 } 269 }
270 DEBUG("Got valid DHCP packet"); 270 log1("Got valid DHCP packet");
271 udhcp_dump_packet(dhcp_pkt);
271 return bytes - (sizeof(packet.ip) + sizeof(packet.udp)); 272 return bytes - (sizeof(packet.ip) + sizeof(packet.udp));
272} 273}
diff --git a/networking/udhcp/clientsocket.c b/networking/udhcp/clientsocket.c
index 1dcc10570..851d5ab5f 100644
--- a/networking/udhcp/clientsocket.c
+++ b/networking/udhcp/clientsocket.c
@@ -85,24 +85,24 @@ int FAST_FUNC udhcp_raw_socket(int ifindex)
85 .filter = (struct sock_filter *) filter_instr, 85 .filter = (struct sock_filter *) filter_instr,
86 }; 86 };
87 87
88 DEBUG("opening raw socket on ifindex %d", ifindex); 88 log1("Opening raw socket on ifindex %d", ifindex); //log2?
89 89
90 fd = xsocket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); 90 fd = xsocket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP));
91 DEBUG("got raw socket fd %d", fd); 91 log1("Got raw socket fd %d", fd); //log2?
92 92
93 if (SERVER_PORT == 67 && CLIENT_PORT == 68) { 93 if (SERVER_PORT == 67 && CLIENT_PORT == 68) {
94 /* Use only if standard ports are in use */ 94 /* Use only if standard ports are in use */
95 /* Ignoring error (kernel may lack support for this) */ 95 /* Ignoring error (kernel may lack support for this) */
96 if (setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter_prog, 96 if (setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter_prog,
97 sizeof(filter_prog)) >= 0) 97 sizeof(filter_prog)) >= 0)
98 DEBUG("attached filter to raw socket fd %d", fd); 98 log1("Attached filter to raw socket fd %d", fd); // log?
99 } 99 }
100 100
101 sock.sll_family = AF_PACKET; 101 sock.sll_family = AF_PACKET;
102 sock.sll_protocol = htons(ETH_P_IP); 102 sock.sll_protocol = htons(ETH_P_IP);
103 sock.sll_ifindex = ifindex; 103 sock.sll_ifindex = ifindex;
104 xbind(fd, (struct sockaddr *) &sock, sizeof(sock)); 104 xbind(fd, (struct sockaddr *) &sock, sizeof(sock));
105 DEBUG("bound to raw socket fd %d", fd); 105 log1("Created raw socket");
106 106
107 return fd; 107 return fd;
108} 108}
diff --git a/networking/udhcp/common.c b/networking/udhcp/common.c
index a47bbafff..c44f38239 100644
--- a/networking/udhcp/common.c
+++ b/networking/udhcp/common.c
@@ -3,9 +3,12 @@
3 * 3 *
4 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. 4 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
5 */ 5 */
6
7#include "common.h" 6#include "common.h"
8 7
8#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
9int dhcp_verbose;
10#endif
11
9const uint8_t MAC_BCAST_ADDR[6] ALIGN2 = { 12const uint8_t MAC_BCAST_ADDR[6] ALIGN2 = {
10 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 13 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
11}; 14};
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h
index 0f12be063..40b8df4df 100644
--- a/networking/udhcp/common.h
+++ b/networking/udhcp/common.h
@@ -62,15 +62,15 @@ uint16_t udhcp_checksum(void *addr, int count) FAST_FUNC;
62 62
63void udhcp_init_header(struct dhcpMessage *packet, char type) FAST_FUNC; 63void udhcp_init_header(struct dhcpMessage *packet, char type) FAST_FUNC;
64 64
65/*int udhcp_recv_raw_packet(struct dhcpMessage *payload, int fd); - in dhcpc.h */ 65/*int udhcp_recv_raw_packet(struct dhcpMessage *dhcp_pkt, int fd); - in dhcpc.h */
66int udhcp_recv_kernel_packet(struct dhcpMessage *packet, int fd) FAST_FUNC; 66int udhcp_recv_kernel_packet(struct dhcpMessage *packet, int fd) FAST_FUNC;
67 67
68int udhcp_send_raw_packet(struct dhcpMessage *payload, 68int udhcp_send_raw_packet(struct dhcpMessage *dhcp_pkt,
69 uint32_t source_ip, int source_port, 69 uint32_t source_ip, int source_port,
70 uint32_t dest_ip, int dest_port, const uint8_t *dest_arp, 70 uint32_t dest_ip, int dest_port, const uint8_t *dest_arp,
71 int ifindex) FAST_FUNC; 71 int ifindex) FAST_FUNC;
72 72
73int udhcp_send_kernel_packet(struct dhcpMessage *payload, 73int udhcp_send_kernel_packet(struct dhcpMessage *dhcp_pkt,
74 uint32_t source_ip, int source_port, 74 uint32_t source_ip, int source_port,
75 uint32_t dest_ip, int dest_port) FAST_FUNC; 75 uint32_t dest_ip, int dest_port) FAST_FUNC;
76 76
@@ -100,10 +100,20 @@ int arpping(uint32_t test_ip,
100 uint8_t *from_mac, 100 uint8_t *from_mac,
101 const char *interface) FAST_FUNC; 101 const char *interface) FAST_FUNC;
102 102
103#if ENABLE_UDHCP_DEBUG 103#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
104# define DEBUG(str, args...) bb_info_msg("### " str, ## args) 104extern int dhcp_verbose;
105# define log1(...) do { if (dhcp_verbose >= 1) bb_info_msg(__VA_ARGS__); } while (0)
106# if CONFIG_UDHCP_DEBUG >= 2
107void udhcp_dump_packet(struct dhcpMessage *packet) FAST_FUNC;
108# define log2(...) do { if (dhcp_verbose >= 2) bb_info_msg(__VA_ARGS__); } while (0)
109# else
110# define udhcp_dump_packet(...) ((void)0)
111# define log2(...) ((void)0)
112# endif
105#else 113#else
106# define DEBUG(str, args...) do {;} while (0) 114# define udhcp_dump_packet(...) ((void)0)
115# define log1(...) ((void)0)
116# define log2(...) ((void)0)
107#endif 117#endif
108 118
109POP_SAVED_FUNCTION_VISIBILITY 119POP_SAVED_FUNCTION_VISIBILITY
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 44ff197b9..eed9d9a01 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -20,9 +20,9 @@
20 20
21static int sockfd = -1; 21static int sockfd = -1;
22 22
23#define LISTEN_NONE 0 23#define LISTEN_NONE 0
24#define LISTEN_KERNEL 1 24#define LISTEN_KERNEL 1
25#define LISTEN_RAW 2 25#define LISTEN_RAW 2
26static smallint listen_mode; 26static smallint listen_mode;
27 27
28#define INIT_SELECTING 0 28#define INIT_SELECTING 0
@@ -41,7 +41,7 @@ static smallint state;
41/* just a little helper */ 41/* just a little helper */
42static void change_listen_mode(int new_mode) 42static void change_listen_mode(int new_mode)
43{ 43{
44 DEBUG("entering %s listen mode", 44 log1("entering %s listen mode",
45 new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none"); 45 new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none");
46 46
47 listen_mode = new_mode; 47 listen_mode = new_mode;
@@ -195,18 +195,17 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
195 OPT_s = 1 << 12, 195 OPT_s = 1 << 12,
196 OPT_T = 1 << 13, 196 OPT_T = 1 << 13,
197 OPT_t = 1 << 14, 197 OPT_t = 1 << 14,
198 OPT_v = 1 << 15, 198 OPT_S = 1 << 15,
199 OPT_S = 1 << 16, 199 OPT_A = 1 << 16,
200 OPT_A = 1 << 17, 200 OPT_O = 1 << 17,
201 OPT_O = 1 << 18, 201 OPT_o = 1 << 18,
202 OPT_o = 1 << 19, 202 OPT_f = 1 << 19,
203 OPT_f = 1 << 20,
204/* The rest has variable bit positions, need to be clever */ 203/* The rest has variable bit positions, need to be clever */
205 OPTBIT_f = 20, 204 OPTBIT_f = 19,
206 USE_FOR_MMU( OPTBIT_b,) 205 USE_FOR_MMU( OPTBIT_b,)
207 IF_FEATURE_UDHCPC_ARPING(OPTBIT_a,) 206 IF_FEATURE_UDHCPC_ARPING(OPTBIT_a,)
208 IF_FEATURE_UDHCP_PORT( OPTBIT_P,) 207 IF_FEATURE_UDHCP_PORT( OPTBIT_P,)
209 USE_FOR_MMU( OPT_b = 1 << OPTBIT_b,) 208 USE_FOR_MMU( OPT_b = 1 << OPTBIT_b,)
210 IF_FEATURE_UDHCPC_ARPING(OPT_a = 1 << OPTBIT_a,) 209 IF_FEATURE_UDHCPC_ARPING(OPT_a = 1 << OPTBIT_a,)
211 IF_FEATURE_UDHCP_PORT( OPT_P = 1 << OPTBIT_P,) 210 IF_FEATURE_UDHCP_PORT( OPT_P = 1 << OPTBIT_P,)
212 }; 211 };
@@ -219,18 +218,26 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
219 218
220 /* Parse command line */ 219 /* Parse command line */
221 /* Cc: mutually exclusive; O: list; -T,-t,-A take numeric param */ 220 /* Cc: mutually exclusive; O: list; -T,-t,-A take numeric param */
222 opt_complementary = "c--C:C--c:O::T+:t+:A+"; 221 opt_complementary = "c--C:C--c:O::T+:t+:A+"
222#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
223 ":vv"
224#endif
225 ;
223 IF_GETOPT_LONG(applet_long_options = udhcpc_longopts;) 226 IF_GETOPT_LONG(applet_long_options = udhcpc_longopts;)
224 opt = getopt32(argv, "c:CV:H:h:F:i:np:qRr:s:T:t:vSA:O:of" 227 opt = getopt32(argv, "c:CV:H:h:F:i:np:qRr:s:T:t:SA:O:of"
225 USE_FOR_MMU("b") 228 USE_FOR_MMU("b")
226 IF_FEATURE_UDHCPC_ARPING("a") 229 IF_FEATURE_UDHCPC_ARPING("a")
227 IF_FEATURE_UDHCP_PORT("P:") 230 IF_FEATURE_UDHCP_PORT("P:")
231 "v"
228 , &str_c, &str_V, &str_h, &str_h, &str_F 232 , &str_c, &str_V, &str_h, &str_h, &str_F
229 , &client_config.interface, &client_config.pidfile, &str_r /* i,p */ 233 , &client_config.interface, &client_config.pidfile, &str_r /* i,p */
230 , &client_config.script /* s */ 234 , &client_config.script /* s */
231 , &discover_timeout, &discover_retries, &tryagain_timeout /* T,t,A */ 235 , &discover_timeout, &discover_retries, &tryagain_timeout /* T,t,A */
232 , &list_O 236 , &list_O
233 IF_FEATURE_UDHCP_PORT(, &str_P) 237 IF_FEATURE_UDHCP_PORT(, &str_P)
238#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
239 , &dhcp_verbose
240#endif
234 ); 241 );
235 if (opt & OPT_c) 242 if (opt & OPT_c)
236 client_config.clientid = alloc_dhcp_option(DHCP_CLIENT_ID, str_c, 0); 243 client_config.clientid = alloc_dhcp_option(DHCP_CLIENT_ID, str_c, 0);
@@ -252,10 +259,6 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
252 } 259 }
253 if (opt & OPT_r) 260 if (opt & OPT_r)
254 requested_ip = inet_addr(str_r); 261 requested_ip = inet_addr(str_r);
255 if (opt & OPT_v) {
256 puts("version "BB_VER);
257 return 0;
258 }
259#if ENABLE_FEATURE_UDHCP_PORT 262#if ENABLE_FEATURE_UDHCP_PORT
260 if (opt & OPT_P) { 263 if (opt & OPT_P) {
261 CLIENT_PORT = xatou16(str_P); 264 CLIENT_PORT = xatou16(str_P);
@@ -348,7 +351,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
348 retval = 0; /* If we already timed out, fall through, else... */ 351 retval = 0; /* If we already timed out, fall through, else... */
349 if (tv.tv_sec > 0) { 352 if (tv.tv_sec > 0) {
350 timestamp_before_wait = (unsigned)monotonic_sec(); 353 timestamp_before_wait = (unsigned)monotonic_sec();
351 DEBUG("Waiting on select..."); 354 log1("Waiting on select...");
352 retval = select(max_fd + 1, &rfds, NULL, NULL, &tv); 355 retval = select(max_fd + 1, &rfds, NULL, NULL, &tv);
353 if (retval < 0) { 356 if (retval < 0) {
354 /* EINTR? A signal was caught, don't panic */ 357 /* EINTR? A signal was caught, don't panic */
@@ -428,7 +431,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
428 case BOUND: 431 case BOUND:
429 /* Half of the lease passed, time to enter renewing state */ 432 /* Half of the lease passed, time to enter renewing state */
430 change_listen_mode(LISTEN_KERNEL); 433 change_listen_mode(LISTEN_KERNEL);
431 DEBUG("Entering renew state"); 434 log1("Entering renew state");
432 state = RENEWING; 435 state = RENEWING;
433 /* fall right through */ 436 /* fall right through */
434 case RENEWING: 437 case RENEWING:
@@ -439,7 +442,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
439 continue; 442 continue;
440 } 443 }
441 /* Timed out, enter rebinding state */ 444 /* Timed out, enter rebinding state */
442 DEBUG("Entering rebinding state"); 445 log1("Entering rebinding state");
443 state = REBINDING; 446 state = REBINDING;
444 /* fall right through */ 447 /* fall right through */
445 case REBINDING: 448 case REBINDING:
@@ -477,7 +480,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
477 else 480 else
478 len = udhcp_recv_raw_packet(&packet, sockfd); 481 len = udhcp_recv_raw_packet(&packet, sockfd);
479 if (len == -1) { /* error is severe, reopen socket */ 482 if (len == -1) { /* error is severe, reopen socket */
480 DEBUG("error on read, %s, reopening socket", strerror(errno)); 483 bb_info_msg("Read error: %s, reopening socket", strerror(errno));
481 sleep(discover_timeout); /* 3 seconds by default */ 484 sleep(discover_timeout); /* 3 seconds by default */
482 change_listen_mode(listen_mode); /* just close and reopen */ 485 change_listen_mode(listen_mode); /* just close and reopen */
483 } 486 }
@@ -489,20 +492,21 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
489 continue; 492 continue;
490 493
491 if (packet.xid != xid) { 494 if (packet.xid != xid) {
492 DEBUG("Ignoring xid %x (our xid is %x)", 495 log1("xid %x (our is %x), ignoring packet",
493 (unsigned)packet.xid, (unsigned)xid); 496 (unsigned)packet.xid, (unsigned)xid);
494 continue; 497 continue;
495 } 498 }
496 499
497 /* Ignore packets that aren't for us */ 500 /* Ignore packets that aren't for us */
498 if (memcmp(packet.chaddr, client_config.client_mac, 6)) { 501 if (memcmp(packet.chaddr, client_config.client_mac, 6)) {
499 DEBUG("Packet does not have our chaddr - ignoring"); 502//FIXME: need to also check that last 10 bytes are zero
503 log1("chaddr does not match, ignoring packet"); // log2?
500 continue; 504 continue;
501 } 505 }
502 506
503 message = get_option(&packet, DHCP_MESSAGE_TYPE); 507 message = get_option(&packet, DHCP_MESSAGE_TYPE);
504 if (message == NULL) { 508 if (message == NULL) {
505 bb_error_msg("cannot get message type from packet - ignoring"); 509 bb_error_msg("no message type option, ignoring packet");
506 continue; 510 continue;
507 } 511 }
508 512
@@ -563,7 +567,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
563 client_config.client_mac, 567 client_config.client_mac,
564 client_config.interface) 568 client_config.interface)
565 ) { 569 ) {
566 bb_info_msg("offered address is in use " 570 bb_info_msg("Offered address is in use "
567 "(got ARP reply), declining"); 571 "(got ARP reply), declining");
568 send_decline(xid, server_addr, packet.yiaddr); 572 send_decline(xid, server_addr, packet.yiaddr);
569 573
diff --git a/networking/udhcp/dhcpc.h b/networking/udhcp/dhcpc.h
index 861e134bd..a7ed779a1 100644
--- a/networking/udhcp/dhcpc.h
+++ b/networking/udhcp/dhcpc.h
@@ -6,12 +6,11 @@
6PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN 6PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
7 7
8struct client_config_t { 8struct client_config_t {
9 uint8_t client_mac[6]; /* Our arp address */ 9 uint8_t client_mac[6]; /* Our mac address */
10 /* TODO: combine flag fields into single "unsigned opt" */ 10 char no_default_options; /* Do not include default options in request */
11 /* (can be set directly to the result of getopt32) */
12 char no_default_options; /* Do not include default optins in request */
13 IF_FEATURE_UDHCP_PORT(uint16_t port;) 11 IF_FEATURE_UDHCP_PORT(uint16_t port;)
14 int ifindex; /* Index number of the interface to use */ 12 int ifindex; /* Index number of the interface to use */
13 int verbose;
15 uint8_t opt_mask[256 / 8]; /* Bitmask of options to send (-O option) */ 14 uint8_t opt_mask[256 / 8]; /* Bitmask of options to send (-O option) */
16 const char *interface; /* The name of the interface to use */ 15 const char *interface; /* The name of the interface to use */
17 char *pidfile; /* Optionally store the process ID */ 16 char *pidfile; /* Optionally store the process ID */
@@ -44,7 +43,7 @@ int send_renew(uint32_t xid, uint32_t server, uint32_t ciaddr) FAST_FUNC;
44int send_renew(uint32_t xid, uint32_t server, uint32_t ciaddr) FAST_FUNC; 43int send_renew(uint32_t xid, uint32_t server, uint32_t ciaddr) FAST_FUNC;
45int send_release(uint32_t server, uint32_t ciaddr) FAST_FUNC; 44int send_release(uint32_t server, uint32_t ciaddr) FAST_FUNC;
46 45
47int udhcp_recv_raw_packet(struct dhcpMessage *payload, int fd) FAST_FUNC; 46int udhcp_recv_raw_packet(struct dhcpMessage *dhcp_pkt, int fd) FAST_FUNC;
48 47
49POP_SAVED_FUNCTION_VISIBILITY 48POP_SAVED_FUNCTION_VISIBILITY
50 49
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
index c74a11b31..cbc968401 100644
--- a/networking/udhcp/dhcpd.c
+++ b/networking/udhcp/dhcpd.c
@@ -44,7 +44,15 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
44 CLIENT_PORT = 68; 44 CLIENT_PORT = 68;
45#endif 45#endif
46 46
47 opt = getopt32(argv, "fS" IF_FEATURE_UDHCP_PORT("P:", &str_P)); 47#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
48 opt_complementary = "vv";
49#endif
50 opt = getopt32(argv, "fSv"
51 IF_FEATURE_UDHCP_PORT("P:", &str_P)
52#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
53 , &dhcp_verbose
54#endif
55 );
48 argv += optind; 56 argv += optind;
49 if (!(opt & 1)) { /* no -f */ 57 if (!(opt & 1)) { /* no -f */
50 bb_daemonize_or_rexec(0, argv); 58 bb_daemonize_or_rexec(0, argv);
@@ -131,7 +139,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
131 continue; 139 continue;
132 } 140 }
133 if (retval < 0 && errno != EINTR) { 141 if (retval < 0 && errno != EINTR) {
134 DEBUG("error on select"); 142 log1("Error on select");
135 continue; 143 continue;
136 } 144 }
137 145
@@ -155,7 +163,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
155 if (bytes < 0) { 163 if (bytes < 0) {
156 /* bytes can also be -2 ("bad packet data") */ 164 /* bytes can also be -2 ("bad packet data") */
157 if (bytes == -1 && errno != EINTR) { 165 if (bytes == -1 && errno != EINTR) {
158 DEBUG("error on read, %s, reopening socket", strerror(errno)); 166 log1("Read error: %s, reopening socket", strerror(errno));
159 close(server_socket); 167 close(server_socket);
160 server_socket = -1; 168 server_socket = -1;
161 } 169 }
@@ -164,7 +172,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
164 172
165 state = get_option(&packet, DHCP_MESSAGE_TYPE); 173 state = get_option(&packet, DHCP_MESSAGE_TYPE);
166 if (state == NULL) { 174 if (state == NULL) {
167 bb_error_msg("cannot get option from packet, ignoring"); 175 bb_error_msg("no message type option, ignoring packet");
168 continue; 176 continue;
169 } 177 }
170 178
@@ -184,14 +192,14 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
184 192
185 switch (state[0]) { 193 switch (state[0]) {
186 case DHCPDISCOVER: 194 case DHCPDISCOVER:
187 DEBUG("Received DISCOVER"); 195 log1("Received DISCOVER");
188 196
189 if (send_offer(&packet) < 0) { 197 if (send_offer(&packet) < 0) {
190 bb_error_msg("send OFFER failed"); 198 bb_error_msg("send OFFER failed");
191 } 199 }
192 break; 200 break;
193 case DHCPREQUEST: 201 case DHCPREQUEST:
194 DEBUG("received REQUEST"); 202 log1("Received REQUEST");
195 203
196 requested = get_option(&packet, DHCP_REQUESTED_IP); 204 requested = get_option(&packet, DHCP_REQUESTED_IP);
197 server_id = get_option(&packet, DHCP_SERVER_ID); 205 server_id = get_option(&packet, DHCP_SERVER_ID);
@@ -204,7 +212,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
204 if (lease) { 212 if (lease) {
205 if (server_id) { 213 if (server_id) {
206 /* SELECTING State */ 214 /* SELECTING State */
207 DEBUG("server_id = %08x", ntohl(server_id_aligned)); 215 log1("server_id = %08x", ntohl(server_id_aligned));
208 if (server_id_aligned == server_config.server_nip 216 if (server_id_aligned == server_config.server_nip
209 && requested 217 && requested
210 && requested_aligned == lease->lease_nip 218 && requested_aligned == lease->lease_nip
@@ -254,19 +262,19 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
254 } 262 }
255 break; 263 break;
256 case DHCPDECLINE: 264 case DHCPDECLINE:
257 DEBUG("Received DECLINE"); 265 log1("Received DECLINE");
258 if (lease) { 266 if (lease) {
259 memset(lease->lease_mac16, 0, 16); 267 memset(lease->lease_mac16, 0, 16);
260 lease->expires = time(NULL) + server_config.decline_time; 268 lease->expires = time(NULL) + server_config.decline_time;
261 } 269 }
262 break; 270 break;
263 case DHCPRELEASE: 271 case DHCPRELEASE:
264 DEBUG("Received RELEASE"); 272 log1("Received RELEASE");
265 if (lease) 273 if (lease)
266 lease->expires = time(NULL); 274 lease->expires = time(NULL);
267 break; 275 break;
268 case DHCPINFORM: 276 case DHCPINFORM:
269 DEBUG("Received INFORM"); 277 log1("Received INFORM");
270 send_inform(&packet); 278 send_inform(&packet);
271 break; 279 break;
272 default: 280 default:
diff --git a/networking/udhcp/dhcpd.h b/networking/udhcp/dhcpd.h
index bb2febbba..53cfad41f 100644
--- a/networking/udhcp/dhcpd.h
+++ b/networking/udhcp/dhcpd.h
@@ -42,6 +42,7 @@ struct server_config_t {
42#endif 42#endif
43 uint8_t server_mac[6]; /* our MAC address (used only for ARP probing) */ 43 uint8_t server_mac[6]; /* our MAC address (used only for ARP probing) */
44 struct option_set *options; /* list of DHCP options loaded from the config file */ 44 struct option_set *options; /* list of DHCP options loaded from the config file */
45 int verbose;
45 /* start,end are in host order: we need to compare start <= ip <= end */ 46 /* start,end are in host order: we need to compare start <= ip <= end */
46 uint32_t start_ip; /* start address of leases, in host order */ 47 uint32_t start_ip; /* start address of leases, in host order */
47 uint32_t end_ip; /* end of leases, in host order */ 48 uint32_t end_ip; /* end of leases, in host order */
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c
index f3899711c..9d5633b75 100644
--- a/networking/udhcp/files.c
+++ b/networking/udhcp/files.c
@@ -96,7 +96,7 @@ static void attach_option(struct option_set **opt_list,
96 96
97 existing = find_option(*opt_list, option->code); 97 existing = find_option(*opt_list, option->code);
98 if (!existing) { 98 if (!existing) {
99 DEBUG("Attaching option %02x to list", option->code); 99 log2("Attaching option %02x to list", option->code);
100 100
101#if ENABLE_FEATURE_UDHCP_RFC3397 101#if ENABLE_FEATURE_UDHCP_RFC3397
102 if ((option->flags & TYPE_MASK) == OPTION_STR1035) 102 if ((option->flags & TYPE_MASK) == OPTION_STR1035)
@@ -125,7 +125,7 @@ static void attach_option(struct option_set **opt_list,
125 } 125 }
126 126
127 /* add it to an existing option */ 127 /* add it to an existing option */
128 DEBUG("Attaching option %02x to existing member of list", option->code); 128 log1("Attaching option %02x to existing member of list", option->code);
129 if (option->flags & OPTION_LIST) { 129 if (option->flags & OPTION_LIST) {
130#if ENABLE_FEATURE_UDHCP_RFC3397 130#if ENABLE_FEATURE_UDHCP_RFC3397
131 if ((option->flags & TYPE_MASK) == OPTION_STR1035) 131 if ((option->flags & TYPE_MASK) == OPTION_STR1035)
@@ -393,7 +393,9 @@ void FAST_FUNC read_leases(const char *file)
393 struct dhcpOfferedAddr lease; 393 struct dhcpOfferedAddr lease;
394 int64_t written_at, time_passed; 394 int64_t written_at, time_passed;
395 int fd; 395 int fd;
396 IF_UDHCP_DEBUG(unsigned i;) 396#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
397 unsigned i = 0;
398#endif
397 399
398 fd = open_or_warn(file, O_RDONLY); 400 fd = open_or_warn(file, O_RDONLY);
399 if (fd < 0) 401 if (fd < 0)
@@ -409,9 +411,8 @@ void FAST_FUNC read_leases(const char *file)
409 if ((uint64_t)time_passed > 12 * 60 * 60) 411 if ((uint64_t)time_passed > 12 * 60 * 60)
410 goto ret; 412 goto ret;
411 413
412 IF_UDHCP_DEBUG(i = 0;)
413 while (full_read(fd, &lease, sizeof(lease)) == sizeof(lease)) { 414 while (full_read(fd, &lease, sizeof(lease)) == sizeof(lease)) {
414 /* ADDME: what if it matches some static lease? */ 415//FIXME: what if it matches some static lease?
415 uint32_t y = ntohl(lease.lease_nip); 416 uint32_t y = ntohl(lease.lease_nip);
416 if (y >= server_config.start_ip && y <= server_config.end_ip) { 417 if (y >= server_config.start_ip && y <= server_config.end_ip) {
417 signed_leasetime_t expires = ntohl(lease.expires) - (signed_leasetime_t)time_passed; 418 signed_leasetime_t expires = ntohl(lease.expires) - (signed_leasetime_t)time_passed;
@@ -423,10 +424,12 @@ void FAST_FUNC read_leases(const char *file)
423 bb_error_msg("too many leases while loading %s", file); 424 bb_error_msg("too many leases while loading %s", file);
424 break; 425 break;
425 } 426 }
426 IF_UDHCP_DEBUG(i++;) 427#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
428 i++;
429#endif
427 } 430 }
428 } 431 }
429 DEBUG("Read %d leases", i); 432 log1("Read %d leases", i);
430 ret: 433 ret:
431 close(fd); 434 close(fd);
432} 435}
diff --git a/networking/udhcp/options.c b/networking/udhcp/options.c
index 143a1fd1c..7b80e6b28 100644
--- a/networking/udhcp/options.c
+++ b/networking/udhcp/options.c
@@ -205,7 +205,7 @@ int FAST_FUNC add_option_string(uint8_t *optionptr, uint8_t *string)
205 string[OPT_CODE]); 205 string[OPT_CODE]);
206 return 0; 206 return 0;
207 } 207 }
208 DEBUG("adding option 0x%02x", string[OPT_CODE]); 208 log1("Adding option 0x%02x", string[OPT_CODE]);
209 memcpy(optionptr + end, string, string[OPT_LEN] + 2); 209 memcpy(optionptr + end, string, string[OPT_LEN] + 2);
210 optionptr[end + string[OPT_LEN] + 2] = DHCP_END; 210 optionptr[end + string[OPT_LEN] + 2] = DHCP_END;
211 return string[OPT_LEN] + 2; 211 return string[OPT_LEN] + 2;
diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c
index e2c8e6ead..2cd5f6176 100644
--- a/networking/udhcp/packet.c
+++ b/networking/udhcp/packet.c
@@ -5,7 +5,6 @@
5 * 5 *
6 * Licensed under GPLv2, see file LICENSE in this tarball for details. 6 * Licensed under GPLv2, see file LICENSE in this tarball for details.
7 */ 7 */
8
9#include <netinet/in.h> 8#include <netinet/in.h>
10#if (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined _NEWLIB_VERSION 9#if (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 1) || defined _NEWLIB_VERSION
11#include <netpacket/packet.h> 10#include <netpacket/packet.h>
@@ -20,7 +19,6 @@
20#include "dhcpd.h" 19#include "dhcpd.h"
21#include "options.h" 20#include "options.h"
22 21
23
24void FAST_FUNC udhcp_init_header(struct dhcpMessage *packet, char type) 22void FAST_FUNC udhcp_init_header(struct dhcpMessage *packet, char type)
25{ 23{
26 memset(packet, 0, sizeof(struct dhcpMessage)); 24 memset(packet, 0, sizeof(struct dhcpMessage));
@@ -38,8 +36,54 @@ void FAST_FUNC udhcp_init_header(struct dhcpMessage *packet, char type)
38 add_simple_option(packet->options, DHCP_MESSAGE_TYPE, type); 36 add_simple_option(packet->options, DHCP_MESSAGE_TYPE, type);
39} 37}
40 38
39#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
40void FAST_FUNC udhcp_dump_packet(struct dhcpMessage *packet)
41{
42 char buf[sizeof(packet->chaddr)*2 + 1];
43
44 if (dhcp_verbose < 2)
45 return;
46
47 bb_info_msg(
48 //" op %x"
49 //" htype %x"
50 " hlen %x"
51 //" hops %x"
52 " xid %x"
53 //" secs %x"
54 //" flags %x"
55 " ciaddr %x"
56 " yiaddr %x"
57 " siaddr %x"
58 " giaddr %x"
59 //" chaddr %s"
60 //" sname %s"
61 //" file %s"
62 //" cookie %x"
63 //" options %s"
64 //, packet->op
65 //, packet->htype
66 , packet->hlen
67 //, packet->hops
68 , packet->xid
69 //, packet->secs
70 //, packet->flags
71 , packet->ciaddr
72 , packet->yiaddr
73 , packet->siaddr_nip
74 , packet->gateway_nip
75 //, packet->chaddr[16]
76 //, packet->sname[64]
77 //, packet->file[128]
78 //, packet->cookie
79 //, packet->options[]
80 );
81 bin2hex(buf, (void *) packet->chaddr, sizeof(packet->chaddr));
82 bb_info_msg(" chaddr %s", buf);
83}
84#endif
41 85
42/* read a packet from socket fd, return -1 on read error, -2 on packet error */ 86/* Read a packet from socket fd, return -1 on read error, -2 on packet error */
43int FAST_FUNC udhcp_recv_kernel_packet(struct dhcpMessage *packet, int fd) 87int FAST_FUNC udhcp_recv_kernel_packet(struct dhcpMessage *packet, int fd)
44{ 88{
45 int bytes; 89 int bytes;
@@ -48,15 +92,16 @@ int FAST_FUNC udhcp_recv_kernel_packet(struct dhcpMessage *packet, int fd)
48 memset(packet, 0, sizeof(*packet)); 92 memset(packet, 0, sizeof(*packet));
49 bytes = safe_read(fd, packet, sizeof(*packet)); 93 bytes = safe_read(fd, packet, sizeof(*packet));
50 if (bytes < 0) { 94 if (bytes < 0) {
51 DEBUG("cannot read on listening socket, ignoring"); 95 log1("Packet read error, ignoring");
52 return bytes; /* returns -1 */ 96 return bytes; /* returns -1 */
53 } 97 }
54 98
55 if (packet->cookie != htonl(DHCP_MAGIC)) { 99 if (packet->cookie != htonl(DHCP_MAGIC)) {
56 bb_error_msg("received bogus message, ignoring"); 100 bb_info_msg("Packet with bad magic, ignoring");
57 return -2; 101 return -2;
58 } 102 }
59 DEBUG("Received a packet"); 103 log1("Received a packet");
104 udhcp_dump_packet(packet);
60 105
61 if (packet->op == BOOTREQUEST) { 106 if (packet->op == BOOTREQUEST) {
62 vendor = get_option(packet, DHCP_VENDOR); 107 vendor = get_option(packet, DHCP_VENDOR);
@@ -71,7 +116,7 @@ int FAST_FUNC udhcp_recv_kernel_packet(struct dhcpMessage *packet, int fd)
71 if (vendor[OPT_LEN - 2] == (uint8_t)strlen(broken_vendors[i]) 116 if (vendor[OPT_LEN - 2] == (uint8_t)strlen(broken_vendors[i])
72 && !strncmp((char*)vendor, broken_vendors[i], vendor[OPT_LEN - 2]) 117 && !strncmp((char*)vendor, broken_vendors[i], vendor[OPT_LEN - 2])
73 ) { 118 ) {
74 DEBUG("broken client (%s), forcing broadcast replies", 119 log1("Broken client (%s), forcing broadcast replies",
75 broken_vendors[i]); 120 broken_vendors[i]);
76 packet->flags |= htons(BROADCAST_FLAG); 121 packet->flags |= htons(BROADCAST_FLAG);
77 } 122 }
@@ -80,7 +125,7 @@ int FAST_FUNC udhcp_recv_kernel_packet(struct dhcpMessage *packet, int fd)
80 if (vendor[OPT_LEN - 2] == (uint8_t)(sizeof("MSFT 98")-1) 125 if (vendor[OPT_LEN - 2] == (uint8_t)(sizeof("MSFT 98")-1)
81 && memcmp(vendor, "MSFT 98", sizeof("MSFT 98")-1) == 0 126 && memcmp(vendor, "MSFT 98", sizeof("MSFT 98")-1) == 0
82 ) { 127 ) {
83 DEBUG("broken client (%s), forcing broadcast replies", "MSFT 98"); 128 log1("Broken client (%s), forcing broadcast replies", "MSFT 98");
84 packet->flags |= htons(BROADCAST_FLAG); 129 packet->flags |= htons(BROADCAST_FLAG);
85 } 130 }
86#endif 131#endif
@@ -90,11 +135,10 @@ int FAST_FUNC udhcp_recv_kernel_packet(struct dhcpMessage *packet, int fd)
90 return bytes; 135 return bytes;
91} 136}
92 137
93
94uint16_t FAST_FUNC udhcp_checksum(void *addr, int count) 138uint16_t FAST_FUNC udhcp_checksum(void *addr, int count)
95{ 139{
96 /* Compute Internet Checksum for "count" bytes 140 /* Compute Internet Checksum for "count" bytes
97 * beginning at location "addr". 141 * beginning at location "addr".
98 */ 142 */
99 int32_t sum = 0; 143 int32_t sum = 0;
100 uint16_t *source = (uint16_t *) addr; 144 uint16_t *source = (uint16_t *) addr;
@@ -120,9 +164,8 @@ uint16_t FAST_FUNC udhcp_checksum(void *addr, int count)
120 return ~sum; 164 return ~sum;
121} 165}
122 166
123
124/* Construct a ip/udp header for a packet, send packet */ 167/* Construct a ip/udp header for a packet, send packet */
125int FAST_FUNC udhcp_send_raw_packet(struct dhcpMessage *payload, 168int FAST_FUNC udhcp_send_raw_packet(struct dhcpMessage *dhcp_pkt,
126 uint32_t source_ip, int source_port, 169 uint32_t source_ip, int source_port,
127 uint32_t dest_ip, int dest_port, const uint8_t *dest_arp, 170 uint32_t dest_ip, int dest_port, const uint8_t *dest_arp,
128 int ifindex) 171 int ifindex)
@@ -146,7 +189,7 @@ int FAST_FUNC udhcp_send_raw_packet(struct dhcpMessage *payload,
146 189
147 memset(&dest, 0, sizeof(dest)); 190 memset(&dest, 0, sizeof(dest));
148 memset(&packet, 0, sizeof(packet)); 191 memset(&packet, 0, sizeof(packet));
149 packet.data = *payload; /* struct copy */ 192 packet.data = *dhcp_pkt; /* struct copy */
150 193
151 dest.sll_family = AF_PACKET; 194 dest.sll_family = AF_PACKET;
152 dest.sll_protocol = htons(ETH_P_IP); 195 dest.sll_protocol = htons(ETH_P_IP);
@@ -179,6 +222,7 @@ int FAST_FUNC udhcp_send_raw_packet(struct dhcpMessage *payload,
179 * If you need to change this: last byte of the packet is 222 * If you need to change this: last byte of the packet is
180 * packet.data.options[end_option(packet.data.options)] 223 * packet.data.options[end_option(packet.data.options)]
181 */ 224 */
225 udhcp_dump_packet(dhcp_pkt);
182 result = sendto(fd, &packet, IP_UPD_DHCP_SIZE, 0, 226 result = sendto(fd, &packet, IP_UPD_DHCP_SIZE, 0,
183 (struct sockaddr *) &dest, sizeof(dest)); 227 (struct sockaddr *) &dest, sizeof(dest));
184 msg = "sendto"; 228 msg = "sendto";
@@ -191,9 +235,8 @@ int FAST_FUNC udhcp_send_raw_packet(struct dhcpMessage *payload,
191 return result; 235 return result;
192} 236}
193 237
194
195/* Let the kernel do all the work for packet generation */ 238/* Let the kernel do all the work for packet generation */
196int FAST_FUNC udhcp_send_kernel_packet(struct dhcpMessage *payload, 239int FAST_FUNC udhcp_send_kernel_packet(struct dhcpMessage *dhcp_pkt,
197 uint32_t source_ip, int source_port, 240 uint32_t source_ip, int source_port,
198 uint32_t dest_ip, int dest_port) 241 uint32_t dest_ip, int dest_port)
199{ 242{
@@ -232,7 +275,8 @@ int FAST_FUNC udhcp_send_kernel_packet(struct dhcpMessage *payload,
232 } 275 }
233 276
234 /* Currently we send full-sized DHCP packets (see above) */ 277 /* Currently we send full-sized DHCP packets (see above) */
235 result = safe_write(fd, payload, DHCP_SIZE); 278 udhcp_dump_packet(dhcp_pkt);
279 result = safe_write(fd, dhcp_pkt, DHCP_SIZE);
236 msg = "write"; 280 msg = "write";
237 ret_close: 281 ret_close:
238 close(fd); 282 close(fd);
diff --git a/networking/udhcp/script.c b/networking/udhcp/script.c
index 97c1d30c3..22780d86a 100644
--- a/networking/udhcp/script.c
+++ b/networking/udhcp/script.c
@@ -218,7 +218,7 @@ void FAST_FUNC udhcp_run_script(struct dhcpMessage *packet, const char *name)
218 if (client_config.script == NULL) 218 if (client_config.script == NULL)
219 return; 219 return;
220 220
221 DEBUG("vfork'ing and exec'ing %s", client_config.script); 221 log1("Executing %s", client_config.script);
222 222
223 envp = fill_envp(packet); 223 envp = fill_envp(packet);
224 224
diff --git a/networking/udhcp/serverpacket.c b/networking/udhcp/serverpacket.c
index d9c5ce3ed..831165d8e 100644
--- a/networking/udhcp/serverpacket.c
+++ b/networking/udhcp/serverpacket.c
@@ -27,48 +27,48 @@
27 27
28 28
29/* send a packet to gateway_nip using the kernel ip stack */ 29/* send a packet to gateway_nip using the kernel ip stack */
30static int send_packet_to_relay(struct dhcpMessage *payload) 30static int send_packet_to_relay(struct dhcpMessage *dhcp_pkt)
31{ 31{
32 DEBUG("Forwarding packet to relay"); 32 log1("Forwarding packet to relay");
33 33
34 return udhcp_send_kernel_packet(payload, 34 return udhcp_send_kernel_packet(dhcp_pkt,
35 server_config.server_nip, SERVER_PORT, 35 server_config.server_nip, SERVER_PORT,
36 payload->gateway_nip, SERVER_PORT); 36 dhcp_pkt->gateway_nip, SERVER_PORT);
37} 37}
38 38
39 39
40/* send a packet to a specific mac address and ip address by creating our own ip packet */ 40/* send a packet to a specific mac address and ip address by creating our own ip packet */
41static int send_packet_to_client(struct dhcpMessage *payload, int force_broadcast) 41static int send_packet_to_client(struct dhcpMessage *dhcp_pkt, int force_broadcast)
42{ 42{
43 const uint8_t *chaddr; 43 const uint8_t *chaddr;
44 uint32_t ciaddr; 44 uint32_t ciaddr;
45 45
46 // Was: 46 // Was:
47 //if (force_broadcast) { /* broadcast */ } 47 //if (force_broadcast) { /* broadcast */ }
48 //else if (payload->ciaddr) { /* unicast to payload->ciaddr */ } 48 //else if (dhcp_pkt->ciaddr) { /* unicast to dhcp_pkt->ciaddr */ }
49 //else if (payload->flags & htons(BROADCAST_FLAG)) { /* broadcast */ } 49 //else if (dhcp_pkt->flags & htons(BROADCAST_FLAG)) { /* broadcast */ }
50 //else { /* unicast to payload->yiaddr */ } 50 //else { /* unicast to dhcp_pkt->yiaddr */ }
51 // But this is wrong: yiaddr is _our_ idea what client's IP is 51 // But this is wrong: yiaddr is _our_ idea what client's IP is
52 // (for example, from lease file). Client may not know that, 52 // (for example, from lease file). Client may not know that,
53 // and may not have UDP socket listening on that IP! 53 // and may not have UDP socket listening on that IP!
54 // We should never unicast to payload->yiaddr! 54 // We should never unicast to dhcp_pkt->yiaddr!
55 // payload->ciaddr, OTOH, comes from client's request packet, 55 // dhcp_pkt->ciaddr, OTOH, comes from client's request packet,
56 // and can be used. 56 // and can be used.
57 57
58 if (force_broadcast 58 if (force_broadcast
59 || (payload->flags & htons(BROADCAST_FLAG)) 59 || (dhcp_pkt->flags & htons(BROADCAST_FLAG))
60 || !payload->ciaddr 60 || !dhcp_pkt->ciaddr
61 ) { 61 ) {
62 DEBUG("broadcasting packet to client"); 62 log1("Broadcasting packet to client");
63 ciaddr = INADDR_BROADCAST; 63 ciaddr = INADDR_BROADCAST;
64 chaddr = MAC_BCAST_ADDR; 64 chaddr = MAC_BCAST_ADDR;
65 } else { 65 } else {
66 DEBUG("unicasting packet to client ciaddr"); 66 log1("Unicasting packet to client ciaddr");
67 ciaddr = payload->ciaddr; 67 ciaddr = dhcp_pkt->ciaddr;
68 chaddr = payload->chaddr; 68 chaddr = dhcp_pkt->chaddr;
69 } 69 }
70 70
71 return udhcp_send_raw_packet(payload, 71 return udhcp_send_raw_packet(dhcp_pkt,
72 /*src*/ server_config.server_nip, SERVER_PORT, 72 /*src*/ server_config.server_nip, SERVER_PORT,
73 /*dst*/ ciaddr, CLIENT_PORT, chaddr, 73 /*dst*/ ciaddr, CLIENT_PORT, chaddr,
74 server_config.ifindex); 74 server_config.ifindex);
@@ -76,11 +76,11 @@ static int send_packet_to_client(struct dhcpMessage *payload, int force_broadcas
76 76
77 77
78/* send a dhcp packet, if force broadcast is set, the packet will be broadcast to the client */ 78/* send a dhcp packet, if force broadcast is set, the packet will be broadcast to the client */
79static int send_packet(struct dhcpMessage *payload, int force_broadcast) 79static int send_packet(struct dhcpMessage *dhcp_pkt, int force_broadcast)
80{ 80{
81 if (payload->gateway_nip) 81 if (dhcp_pkt->gateway_nip)
82 return send_packet_to_relay(payload); 82 return send_packet_to_relay(dhcp_pkt);
83 return send_packet_to_client(payload, force_broadcast); 83 return send_packet_to_client(dhcp_pkt, force_broadcast);
84} 84}
85 85
86 86
@@ -201,7 +201,7 @@ int FAST_FUNC send_NAK(struct dhcpMessage *oldpacket)
201 201
202 init_packet(&packet, oldpacket, DHCPNAK); 202 init_packet(&packet, oldpacket, DHCPNAK);
203 203
204 DEBUG("Sending NAK"); 204 log1("Sending NAK");
205 return send_packet(&packet, 1); 205 return send_packet(&packet, 1);
206} 206}
207 207
diff --git a/networking/udhcp/socket.c b/networking/udhcp/socket.c
index de494ca38..6b15766c9 100644
--- a/networking/udhcp/socket.c
+++ b/networking/udhcp/socket.c
@@ -57,7 +57,7 @@ int FAST_FUNC udhcp_read_interface(const char *interface, int *ifindex, uint32_t
57 } 57 }
58 our_ip = (struct sockaddr_in *) &ifr.ifr_addr; 58 our_ip = (struct sockaddr_in *) &ifr.ifr_addr;
59 *nip = our_ip->sin_addr.s_addr; 59 *nip = our_ip->sin_addr.s_addr;
60 DEBUG("ip of %s = %s", interface, inet_ntoa(our_ip->sin_addr)); 60 log1("IP %s", inet_ntoa(our_ip->sin_addr));
61 } 61 }
62 62
63 if (ifindex) { 63 if (ifindex) {
@@ -65,7 +65,7 @@ int FAST_FUNC udhcp_read_interface(const char *interface, int *ifindex, uint32_t
65 close(fd); 65 close(fd);
66 return -1; 66 return -1;
67 } 67 }
68 DEBUG("adapter index %d", ifr.ifr_ifindex); 68 log1("Adapter index %d", ifr.ifr_ifindex);
69 *ifindex = ifr.ifr_ifindex; 69 *ifindex = ifr.ifr_ifindex;
70 } 70 }
71 71
@@ -75,7 +75,7 @@ int FAST_FUNC udhcp_read_interface(const char *interface, int *ifindex, uint32_t
75 return -1; 75 return -1;
76 } 76 }
77 memcpy(mac, ifr.ifr_hwaddr.sa_data, 6); 77 memcpy(mac, ifr.ifr_hwaddr.sa_data, 6);
78 DEBUG("adapter hardware address %02x:%02x:%02x:%02x:%02x:%02x", 78 log1("MAC %02x:%02x:%02x:%02x:%02x:%02x",
79 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); 79 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
80 } 80 }
81 81
@@ -90,7 +90,7 @@ int FAST_FUNC udhcp_listen_socket(/*uint32_t ip,*/ int port, const char *inf)
90 int fd; 90 int fd;
91 struct sockaddr_in addr; 91 struct sockaddr_in addr;
92 92
93 DEBUG("Opening listen socket on *:%d %s", port, inf); 93 log1("Opening listen socket on *:%d %s", port, inf);
94 fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 94 fd = xsocket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
95 95
96 setsockopt_reuseaddr(fd); 96 setsockopt_reuseaddr(fd);