aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-02-04 13:12:16 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-02-04 13:12:16 +0000
commitd55fe3e595eb0aad60484d273e251cfee4ef8aa5 (patch)
tree1b9ff57d70411902db36582da8dbaded99485eeb
parente8ef7ec7de0cd9906b42a94eddb800ed1229a614 (diff)
downloadbusybox-w32-d55fe3e595eb0aad60484d273e251cfee4ef8aa5.tar.gz
busybox-w32-d55fe3e595eb0aad60484d273e251cfee4ef8aa5.tar.bz2
busybox-w32-d55fe3e595eb0aad60484d273e251cfee4ef8aa5.zip
udhcp: optional support for non-standard DHCP ports (+300 bytes when selected)
-rw-r--r--include/usage.h15
-rw-r--r--networking/udhcp/Config.in7
-rw-r--r--networking/udhcp/clientsocket.c14
-rw-r--r--networking/udhcp/common.h3
-rw-r--r--networking/udhcp/dhcpc.c17
-rw-r--r--networking/udhcp/dhcpc.h10
-rw-r--r--networking/udhcp/dhcpd.c16
-rw-r--r--networking/udhcp/dhcpd.h9
-rw-r--r--networking/udhcp/dhcprelay.c1
-rw-r--r--networking/udhcp/serverpacket.c1
10 files changed, 79 insertions, 14 deletions
diff --git a/include/usage.h b/include/usage.h
index 989ed9134..fb88e9bcd 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -3892,7 +3892,7 @@ USE_FEATURE_RUN_PARTS_FANCY("\n -l Prints names of all matching files even when
3892 3892
3893#define udhcpc_trivial_usage \ 3893#define udhcpc_trivial_usage \
3894 "[-Cfbnqtv] [-c CID] [-V VCLS] [-H HOSTNAME] [-i INTERFACE]\n" \ 3894 "[-Cfbnqtv] [-c CID] [-V VCLS] [-H HOSTNAME] [-i INTERFACE]\n" \
3895 " [-p pidfile] [-r IP] [-s script] [-O dhcp-option]..." 3895 " [-p pidfile] [-r IP] [-s script] [-O dhcp-option]..." USE_FEATURE_UDHCP_PORT(" [-P N]")
3896#define udhcpc_full_usage \ 3896#define udhcpc_full_usage \
3897 USE_GETOPT_LONG( \ 3897 USE_GETOPT_LONG( \
3898 " -V,--vendorclass=CLASSID Vendor class identifier" \ 3898 " -V,--vendorclass=CLASSID Vendor class identifier" \
@@ -3913,6 +3913,9 @@ USE_FEATURE_RUN_PARTS_FANCY("\n -l Prints names of all matching files even when
3913 "\n -q,--quit Quit after obtaining lease" \ 3913 "\n -q,--quit Quit after obtaining lease" \
3914 "\n -R,--release Release IP on quit" \ 3914 "\n -R,--release Release IP on quit" \
3915 "\n -O,--request-option=OPT Request DHCP option OPT from server" \ 3915 "\n -O,--request-option=OPT Request DHCP option OPT from server" \
3916 USE_FEATURE_UDHCP_PORT( \
3917 "\n -P,--client-port N Use port N instead of default 68" \
3918 ) \
3916 USE_FEATURE_UDHCPC_ARPING( \ 3919 USE_FEATURE_UDHCPC_ARPING( \
3917 "\n -a,--arping Use arping to validate offered address" \ 3920 "\n -a,--arping Use arping to validate offered address" \
3918 ) \ 3921 ) \
@@ -3936,18 +3939,24 @@ USE_FEATURE_RUN_PARTS_FANCY("\n -l Prints names of all matching files even when
3936 "\n -q Quit after obtaining lease" \ 3939 "\n -q Quit after obtaining lease" \
3937 "\n -R Release IP on quit" \ 3940 "\n -R Release IP on quit" \
3938 "\n -O OPT Request DHCP option OPT from server" \ 3941 "\n -O OPT Request DHCP option OPT from server" \
3942 USE_FEATURE_UDHCP_PORT( \
3943 "\n -P N Use port N instead of default 68" \
3944 ) \
3939 USE_FEATURE_UDHCPC_ARPING( \ 3945 USE_FEATURE_UDHCPC_ARPING( \
3940 "\n -a Use arping to validate offered address" \ 3946 "\n -a Use arping to validate offered address" \
3941 ) \ 3947 ) \
3942 ) 3948 )
3943 3949
3944#define udhcpd_trivial_usage \ 3950#define udhcpd_trivial_usage \
3945 "[-fS] [configfile]" \ 3951 "[-fS]" USE_FEATURE_UDHCP_PORT(" [-P N]") " [configfile]" \
3946 3952
3947#define udhcpd_full_usage \ 3953#define udhcpd_full_usage \
3948 "DHCP server" \ 3954 "DHCP server" \
3949 "\n -f Run in foreground" \ 3955 "\n -f Run in foreground" \
3950 "\n -S Log to syslog too" 3956 "\n -S Log to syslog too" \
3957 USE_FEATURE_UDHCP_PORT( \
3958 "\n -P N Use port N instead of default 67" \
3959 )
3951 3960
3952#define umount_trivial_usage \ 3961#define umount_trivial_usage \
3953 "[flags] FILESYSTEM|DIRECTORY" 3962 "[flags] FILESYSTEM|DIRECTORY"
diff --git a/networking/udhcp/Config.in b/networking/udhcp/Config.in
index 26cc8f501..ff0e4e2ae 100644
--- a/networking/udhcp/Config.in
+++ b/networking/udhcp/Config.in
@@ -63,6 +63,13 @@ config FEATURE_UDHCPC_ARPING
63 is really available. The client will DHCPDECLINE the offer if the 63 is really available. The client will DHCPDECLINE the offer if the
64 address is in use, and restart the discover process. 64 address is in use, and restart the discover process.
65 65
66config FEATURE_UDHCP_PORT
67 bool "Enable '-P port' option for udhcpd and udhcpc"
68 default n
69 depends on APP_UDHCPD || APP_UDHCPC
70 help
71 At the cost of ~300 bytes, enables -P port option.
72 This feature is typically not needed.
66 73
67config FEATURE_UDHCP_DEBUG 74config FEATURE_UDHCP_DEBUG
68 bool "Compile udhcp with noisy debugging messages" 75 bool "Compile udhcp with noisy debugging messages"
diff --git a/networking/udhcp/clientsocket.c b/networking/udhcp/clientsocket.c
index 954db5319..b5534f83e 100644
--- a/networking/udhcp/clientsocket.c
+++ b/networking/udhcp/clientsocket.c
@@ -33,8 +33,8 @@
33#include <linux/filter.h> 33#include <linux/filter.h>
34 34
35#include "common.h" 35#include "common.h"
36 36#include "dhcpd.h"
37#define SERVER_AND_CLIENT_PORTS ((SERVER_PORT << 16) + CLIENT_PORT) 37#include "dhcpc.h"
38 38
39int raw_socket(int ifindex) 39int raw_socket(int ifindex)
40{ 40{
@@ -62,6 +62,7 @@ int raw_socket(int ifindex)
62 * 62 *
63 * TODO: make conditional? 63 * TODO: make conditional?
64 */ 64 */
65#define SERVER_AND_CLIENT_PORTS ((67 << 16) + 68)
65 static const struct sock_filter filter_instr[] = { 66 static const struct sock_filter filter_instr[] = {
66 /* check for udp */ 67 /* check for udp */
67 BPF_STMT(BPF_LD|BPF_B|BPF_ABS, 9), 68 BPF_STMT(BPF_LD|BPF_B|BPF_ABS, 9),
@@ -89,10 +90,13 @@ int raw_socket(int ifindex)
89 fd = xsocket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); 90 fd = xsocket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP));
90 DEBUG("got raw socket fd %d", fd); 91 DEBUG("got raw socket fd %d", fd);
91 92
92 /* Ignoring error (kernel may lack support for this) */ 93 if (SERVER_PORT == 67 && CLIENT_PORT == 68) {
93 if (setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter_prog, 94 /* Use only if standard ports are in use */
95 /* Ignoring error (kernel may lack support for this) */
96 if (setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, &filter_prog,
94 sizeof(filter_prog)) >= 0) 97 sizeof(filter_prog)) >= 0)
95 DEBUG("attached filter to raw socket fd %d", fd); 98 DEBUG("attached filter to raw socket fd %d", fd);
99 }
96 100
97 sock.sll_family = AF_PACKET; 101 sock.sll_family = AF_PACKET;
98 sock.sll_protocol = htons(ETH_P_IP); 102 sock.sll_protocol = htons(ETH_P_IP);
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h
index b1d629b18..9b26678c1 100644
--- a/networking/udhcp/common.h
+++ b/networking/udhcp/common.h
@@ -14,9 +14,6 @@
14 14
15#define DEFAULT_SCRIPT "/usr/share/udhcpc/default.script" 15#define DEFAULT_SCRIPT "/usr/share/udhcpc/default.script"
16 16
17#define SERVER_PORT 67
18#define CLIENT_PORT 68
19
20extern const uint8_t MAC_BCAST_ADDR[6]; /* six all-ones */ 17extern const uint8_t MAC_BCAST_ADDR[6]; /* six all-ones */
21 18
22/*** packet.h ***/ 19/*** packet.h ***/
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index f54bc08f1..7fca184ab 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -133,6 +133,7 @@ int udhcpc_main(int argc, char **argv)
133{ 133{
134 uint8_t *temp, *message; 134 uint8_t *temp, *message;
135 char *str_c, *str_V, *str_h, *str_F, *str_r, *str_T, *str_A, *str_t; 135 char *str_c, *str_V, *str_h, *str_F, *str_r, *str_T, *str_A, *str_t;
136 USE_FEATURE_UDHCP_PORT(char *str_P;)
136 llist_t *list_O = NULL; 137 llist_t *list_O = NULL;
137#if ENABLE_FEATURE_UDHCPC_ARPING 138#if ENABLE_FEATURE_UDHCPC_ARPING
138 char *str_W; 139 char *str_W;
@@ -181,6 +182,7 @@ int udhcpc_main(int argc, char **argv)
181 OPT_a = 1 << 20, 182 OPT_a = 1 << 20,
182 OPT_W = 1 << 21, 183 OPT_W = 1 << 21,
183#endif 184#endif
185 OPT_P = 1 << 22,
184 }; 186 };
185#if ENABLE_GETOPT_LONG 187#if ENABLE_GETOPT_LONG
186 static const char udhcpc_longopts[] ALIGN1 = 188 static const char udhcpc_longopts[] ALIGN1 =
@@ -207,9 +209,16 @@ int udhcpc_main(int argc, char **argv)
207 "arping\0" No_argument "a" 209 "arping\0" No_argument "a"
208#endif 210#endif
209 "request-option\0" Required_argument "O" 211 "request-option\0" Required_argument "O"
212#if ENABLE_FEATURE_UDHCP_PORT
213 "client-port\0" Required_argument "P"
214#endif
210 ; 215 ;
211#endif 216#endif
212 /* Default options. */ 217 /* Default options. */
218#if ENABLE_FEATURE_UDHCP_PORT
219 SERVER_PORT = 67;
220 CLIENT_PORT = 68;
221#endif
213 client_config.interface = "eth0"; 222 client_config.interface = "eth0";
214 client_config.script = DEFAULT_SCRIPT; 223 client_config.script = DEFAULT_SCRIPT;
215 224
@@ -220,11 +229,13 @@ int udhcpc_main(int argc, char **argv)
220#endif 229#endif
221 opt = getopt32(argv, "c:CV:fbH:h:F:i:np:qRr:s:T:t:vSA:" 230 opt = getopt32(argv, "c:CV:fbH:h:F:i:np:qRr:s:T:t:vSA:"
222 USE_FEATURE_UDHCPC_ARPING("aW:") 231 USE_FEATURE_UDHCPC_ARPING("aW:")
232 USE_FEATURE_UDHCP_PORT("P:")
223 "O:" 233 "O:"
224 , &str_c, &str_V, &str_h, &str_h, &str_F 234 , &str_c, &str_V, &str_h, &str_h, &str_F
225 , &client_config.interface, &client_config.pidfile, &str_r 235 , &client_config.interface, &client_config.pidfile, &str_r
226 , &client_config.script, &str_T, &str_t, &str_A 236 , &client_config.script, &str_T, &str_t, &str_A
227 USE_FEATURE_UDHCPC_ARPING(, &str_W) 237 USE_FEATURE_UDHCPC_ARPING(, &str_W)
238 USE_FEATURE_UDHCP_PORT(, &str_P)
228 , &list_O 239 , &list_O
229 ); 240 );
230 241
@@ -276,6 +287,12 @@ int udhcpc_main(int argc, char **argv)
276 openlog(applet_name, LOG_PID, LOG_LOCAL0); 287 openlog(applet_name, LOG_PID, LOG_LOCAL0);
277 logmode |= LOGMODE_SYSLOG; 288 logmode |= LOGMODE_SYSLOG;
278 } 289 }
290#if ENABLE_FEATURE_UDHCP_PORT
291 if (opt & OPT_P) {
292 CLIENT_PORT = xatou16(str_P);
293 SERVER_PORT = CLIENT_PORT - 1;
294 }
295#endif
279 while (list_O) { 296 while (list_O) {
280 int n = index_in_strings(dhcp_option_strings, list_O->data); 297 int n = index_in_strings(dhcp_option_strings, list_O->data);
281 if (n < 0) 298 if (n < 0)
diff --git a/networking/udhcp/dhcpc.h b/networking/udhcp/dhcpc.h
index bc05754ac..4b8f3ec98 100644
--- a/networking/udhcp/dhcpc.h
+++ b/networking/udhcp/dhcpc.h
@@ -29,11 +29,19 @@ struct client_config_t {
29 uint8_t *hostname; /* Optional hostname to use */ 29 uint8_t *hostname; /* Optional hostname to use */
30 uint8_t *fqdn; /* Optional fully qualified domain name to use */ 30 uint8_t *fqdn; /* Optional fully qualified domain name to use */
31 int ifindex; /* Index number of the interface to use */ 31 int ifindex; /* Index number of the interface to use */
32 uint16_t port;
32 uint8_t arp[6]; /* Our arp address */ 33 uint8_t arp[6]; /* Our arp address */
33 uint8_t opt_mask[256 / 8]; /* Bitmask of options to send (-O option) */ 34 uint8_t opt_mask[256 / 8]; /* Bitmask of options to send (-O option) */
34}; 35};
35 36
36#define client_config (*(struct client_config_t*)&bb_common_bufsiz1) 37/* server_config sits in 1st half of bb_common_bufsiz1 */
38#define client_config (*(struct client_config_t*)(&bb_common_bufsiz1[COMMON_BUFSIZE/2]))
39
40#if ENABLE_FEATURE_UDHCP_PORT
41#define CLIENT_PORT (client_config.port)
42#else
43#define CLIENT_PORT 68
44#endif
37 45
38 46
39/*** clientpacket.h ***/ 47/*** clientpacket.h ***/
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
index 45f445b48..eb7323da7 100644
--- a/networking/udhcp/dhcpd.c
+++ b/networking/udhcp/dhcpd.c
@@ -12,6 +12,7 @@
12 12
13#include <syslog.h> 13#include <syslog.h>
14#include "common.h" 14#include "common.h"
15#include "dhcpc.h"
15#include "dhcpd.h" 16#include "dhcpd.h"
16#include "options.h" 17#include "options.h"
17 18
@@ -35,8 +36,14 @@ int udhcpd_main(int argc, char **argv)
35 unsigned opt; 36 unsigned opt;
36 struct option_set *option; 37 struct option_set *option;
37 struct dhcpOfferedAddr *lease, static_lease; 38 struct dhcpOfferedAddr *lease, static_lease;
39 USE_FEATURE_UDHCP_PORT(char *str_P;)
38 40
39 opt = getopt32(argv, "fS"); 41#if ENABLE_FEATURE_UDHCP_PORT
42 SERVER_PORT = 67;
43 CLIENT_PORT = 68;
44#endif
45
46 opt = getopt32(argv, "fS" USE_FEATURE_UDHCP_PORT("P:", &str_P));
40 argv += optind; 47 argv += optind;
41 48
42 if (!(opt & 1)) { /* no -f */ 49 if (!(opt & 1)) { /* no -f */
@@ -48,7 +55,12 @@ int udhcpd_main(int argc, char **argv)
48 openlog(applet_name, LOG_PID, LOG_LOCAL0); 55 openlog(applet_name, LOG_PID, LOG_LOCAL0);
49 logmode |= LOGMODE_SYSLOG; 56 logmode |= LOGMODE_SYSLOG;
50 } 57 }
51 58#if ENABLE_FEATURE_UDHCP_PORT
59 if (opt & 4) { /* -P */
60 SERVER_PORT = xatou16(str_P);
61 CLIENT_PORT = SERVER_PORT + 1;
62 }
63#endif
52 /* Would rather not do read_config before daemonization - 64 /* Would rather not do read_config before daemonization -
53 * otherwise NOMMU machines will parse config twice */ 65 * otherwise NOMMU machines will parse config twice */
54 read_config(argv[0] ? argv[0] : DHCPD_CONF_FILE); 66 read_config(argv[0] ? argv[0] : DHCPD_CONF_FILE);
diff --git a/networking/udhcp/dhcpd.h b/networking/udhcp/dhcpd.h
index 216b7ab64..fe45ca312 100644
--- a/networking/udhcp/dhcpd.h
+++ b/networking/udhcp/dhcpd.h
@@ -1,5 +1,6 @@
1/* vi: set sw=4 ts=4: */ 1/* vi: set sw=4 ts=4: */
2/* dhcpd.h */ 2/* dhcpd.h */
3
3#ifndef _DHCPD_H 4#ifndef _DHCPD_H
4#define _DHCPD_H 5#define _DHCPD_H
5 6
@@ -27,6 +28,7 @@ struct static_lease {
27 28
28struct server_config_t { 29struct server_config_t {
29 uint32_t server; /* Our IP, in network order */ 30 uint32_t server; /* Our IP, in network order */
31 uint16_t port;
30 /* start,end are in host order: we need to compare start <= ip <= end */ 32 /* start,end are in host order: we need to compare start <= ip <= end */
31 uint32_t start_ip; /* Start address of leases, in host order */ 33 uint32_t start_ip; /* Start address of leases, in host order */
32 uint32_t end_ip; /* End of leases, in host order */ 34 uint32_t end_ip; /* End of leases, in host order */
@@ -55,6 +57,13 @@ struct server_config_t {
55}; 57};
56 58
57#define server_config (*(struct server_config_t*)&bb_common_bufsiz1) 59#define server_config (*(struct server_config_t*)&bb_common_bufsiz1)
60/* client_config sits in 2nd half of bb_common_bufsiz1 */
61
62#if ENABLE_FEATURE_UDHCP_PORT
63#define SERVER_PORT (server_config.port)
64#else
65#define SERVER_PORT 67
66#endif
58 67
59extern struct dhcpOfferedAddr *leases; 68extern struct dhcpOfferedAddr *leases;
60 69
diff --git a/networking/udhcp/dhcprelay.c b/networking/udhcp/dhcprelay.c
index c243cc16c..def1bc297 100644
--- a/networking/udhcp/dhcprelay.c
+++ b/networking/udhcp/dhcprelay.c
@@ -14,6 +14,7 @@
14#include "options.h" 14#include "options.h"
15 15
16/* constants */ 16/* constants */
17#define SERVER_PORT 67
17#define SELECT_TIMEOUT 5 /* select timeout in sec. */ 18#define SELECT_TIMEOUT 5 /* select timeout in sec. */
18#define MAX_LIFETIME 2*60 /* lifetime of an xid entry in sec. */ 19#define MAX_LIFETIME 2*60 /* lifetime of an xid entry in sec. */
19 20
diff --git a/networking/udhcp/serverpacket.c b/networking/udhcp/serverpacket.c
index 764b9a8f6..1dc7233f2 100644
--- a/networking/udhcp/serverpacket.c
+++ b/networking/udhcp/serverpacket.c
@@ -21,6 +21,7 @@
21 */ 21 */
22 22
23#include "common.h" 23#include "common.h"
24#include "dhcpc.h"
24#include "dhcpd.h" 25#include "dhcpd.h"
25#include "options.h" 26#include "options.h"
26 27