summaryrefslogtreecommitdiffstats
path: root/meta/recipes-core/busybox/busybox/busybox-udhcpc-no_deconfig.patch
blob: 35e981d6a2aa4207e5c23d109ac41edb1f5adb62 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
From 53626cd06a3ef05ed847daea802ef0aa9661caa7 Mon Sep 17 00:00:00 2001
From: Anders Darander <anders@chargestorm.se>
Date: Thu, 3 Nov 2011 08:51:31 +0100
Subject: [PATCH] busybox-udhcpc-no_deconfig.patch

Upstream-Status: Pending

Add a new option -D to the udhcpc client that allows for
dhcp renewal to occur without having to down the interface
in the process.

Signed-off-by: Greg Moffatt <greg.moffatt@windriver.com>

Updated to latest Busybox 1.17.3

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>

Updated to Busybox 1.18.4
option spec is changed

Signed-off-by: Qing He <qing.he@intel.com>

Updated to Busybox 1.19.3

Signed-off-by: Anders Darander <anders@chargestorm.se>

Fixed options -b, -a and -P.

Signed-off-by: Andreas Oberritter <obi@opendreambox.org>
---
 networking/udhcp/dhcpc.c                       | 29 ++++++++++++++++------
 1 file changed, 21 insertions(+), 8 deletions(-)

Index: busybox-1.32.0/networking/udhcp/dhcpc.c
===================================================================
--- busybox-1.32.0.orig/networking/udhcp/dhcpc.c
+++ busybox-1.32.0/networking/udhcp/dhcpc.c
@@ -48,6 +48,8 @@ struct tpacket_auxdata {
 };
 #endif
 
+/* option whether to down the interface when reconfiguring */
+static int allow_deconfig = 1;
 
 /* "struct client_data_t client_data" is in bb_common_bufsiz1 */
 
@@ -103,8 +105,10 @@
 	OPT_x = 1 << 18,
 	OPT_f = 1 << 19,
 	OPT_B = 1 << 20,
+	OPT_D = 1 << 21,
 /* The rest has variable bit positions, need to be clever */
 	OPTBIT_B = 20,
+	OPTBIT_D = 21,
 	USE_FOR_MMU(             OPTBIT_b,)
 	IF_FEATURE_UDHCPC_ARPING(OPTBIT_a,)
 	IF_FEATURE_UDHCP_PORT(   OPTBIT_P,)
@@ -1084,7 +1088,8 @@
 		client_data.state = RENEW_REQUESTED;
 		break;
 	case RENEW_REQUESTED: /* impatient are we? fine, square 1 */
-		udhcp_run_script(NULL, "deconfig");
+		if (allow_deconfig)
+			udhcp_run_script(NULL, "deconfig");
 	case REQUESTING:
 	case RELEASED:
 		change_listen_mode(LISTEN_RAW);
@@ -1120,7 +1125,8 @@ static void perform_release(uint32_t server_addr, uint32_t requested_ip)
  * Users requested to be notified in all cases, even if not in one
  * of the states above.
  */
-	udhcp_run_script(NULL, "deconfig");
+	if (allow_deconfig)
+		udhcp_run_script(NULL, "deconfig");
 
 	change_listen_mode(LISTEN_NONE);
 	client_data.state = RELEASED;
@@ -1238,7 +1244,7 @@
 	/* Parse command line */
 	opt = getopt32long(argv, "^"
 		/* O,x: list; -T,-t,-A take numeric param */
-		"CV:H:h:F:i:np:qRr:s:T:+t:+SA:+O:*ox:*fB"
+		"CV:H:h:F:i:np:qRr:s:T:+t:+SA:+O:*ox:*fBD"
 		USE_FOR_MMU("b")
 		IF_FEATURE_UDHCPC_ARPING("a::")
 		IF_FEATURE_UDHCP_PORT("P:")
@@ -1349,6 +1355,10 @@
 		logmode |= LOGMODE_SYSLOG;
 	}
 
+	if (opt & OPT_D) {
+		allow_deconfig = 0;
+	}
+
 	/* Create pidfile */
 	write_pidfile(client_data.pidfile);
 	/* Goes to stdout (unless NOMMU) and possibly syslog */
@@ -1357,7 +1367,8 @@
 	srand(monotonic_us());
 
 	client_data.state = INIT_SELECTING;
-	udhcp_run_script(NULL, "deconfig");
+	if (allow_deconfig)
+		udhcp_run_script(NULL, "deconfig");
 	change_listen_mode(LISTEN_RAW);
 	packet_num = 0;
 	timeout = 0;
@@ -1530,7 +1541,8 @@
 				}
 				/* Timed out, enter init state */
 				bb_simple_info_msg("lease lost, entering init state");
-				udhcp_run_script(NULL, "deconfig");
+				if (allow_deconfig)
+					udhcp_run_script(NULL, "deconfig");
 				client_data.state = INIT_SELECTING;
 				client_data.first_secs = 0; /* make secs field count from 0 */
 				/*timeout = 0; - already is */
@@ -1722,8 +1734,10 @@
 							"(got ARP reply), declining");
 						send_decline(/*xid,*/ server_addr, packet.yiaddr);
 
-						if (client_data.state != REQUESTING)
-							udhcp_run_script(NULL, "deconfig");
+						if (client_data.state != REQUESTING) {
+							if (allow_deconfig)
+								udhcp_run_script(NULL, "deconfig");
+						}
 						change_listen_mode(LISTEN_RAW);
 						client_data.state = INIT_SELECTING;
 						client_data.first_secs = 0; /* make secs field count from 0 */
@@ -1792,8 +1806,10 @@
 				/* return to init state */
 				bb_info_msg("received %s", "DHCP NAK");
 				udhcp_run_script(&packet, "nak");
-				if (client_data.state != REQUESTING)
-					udhcp_run_script(NULL, "deconfig");
+				if (client_data.state != REQUESTING) {
+					if (allow_deconfig)
+						udhcp_run_script(NULL, "deconfig");
+				}
 				change_listen_mode(LISTEN_RAW);
 				sleep(3); /* avoid excessive network traffic */
 				client_data.state = INIT_SELECTING;