[PATCH] udhcpd static route support

Michael McTernan Michael.McTernan.2001 at cs.bris.ac.uk
Fri Dec 16 09:31:18 UTC 2011


On 12/16/2011 01:14 AM, Dan Fandrich wrote:
> On Thu, Dec 15, 2011 at 10:57:19PM +0000, Michael McTernan wrote:
>> +				val = strtok(NULL, ", \t/-");
> 
> / and - seems like they would be confusing as separators in this
> context (e.g. 1.2.3.4/5.6.7.8/9.8.7.6 would be parsed the same way
> as 1.2.3.4/5, 9.8.7.6) but I can also see that it maintains compatibility
> with OPTION_IP_PAIR.

Yep - I wasn't sure about that, but chose to use the same as IP_PAIR.  I guess the compiler may get to reuse the string constant for some small space saving too.  

>> +
>> +			if (retval) {
> 
> This block could be moved one line up into the previous else block.

Done.
 
> How about adding an example in examples/udhcp/udhcpd.conf?

Done.  That should help users with any ambiguity as per your first point.


Thanks for the prompt feedback; here is a revised version of the patch for all to review.

Kind Regards,

Mike


Signed-off-by: Michael McTernan <Michael.McTernan.2001 at cs.bris.ac.uk>
---
 examples/udhcp/udhcpd.conf |    7 +++++--
 networking/udhcp/common.c  |   38 +++++++++++++++++++++++++++++++-------
 2 files changed, 36 insertions(+), 9 deletions(-)

diff -Naur -x .svn busybox-1.19.3/examples/udhcp/udhcpd.conf busybox-1.19.3-static-route/examples/udhcp/udhcpd.conf
--- busybox-1.19.3/examples/udhcp/udhcpd.conf	2011-09-06 03:35:17.000000000 +0100
+++ busybox-1.19.3-static-route/examples/udhcp/udhcpd.conf	2011-12-16 08:57:31.517279398 +0000
@@ -68,6 +68,8 @@
 option	dns	129.219.13.81	# appended to above DNS servers for a total of 3
 option	domain	local
 option	lease	864000		# default: 10 days
+option	msstaticroutes	10.0.0.0/8 10.127.0.1		# single static route
+option	staticroutes	10.0.0.0/8 10.127.0.1, 10.11.12.0/24 10.11.12.1
 # Arbitrary option in hex form:
 option	0x08	01020304	# option 8: "cookie server IP addr: 1.2.3.4"

@@ -101,6 +103,8 @@
 #opt swapsrv    IP
 # Options specifying routes
 #opt routes     IP_PAIR_LIST
+#opt staticroutes   STATIC_ROUTES # RFC 3442 classless static route option
+#opt msstaticroutes STATIC_ROUTES # RFC 3442, using MS option number
 # Obsolete options, no longer supported
 #opt logsrv     IP_LIST	# 704/UDP log server (not syslog!)
 #opt namesrv    IP_LIST	# IEN 116 name server, obsolete (August 1979!!!)
@@ -109,5 +113,4 @@
 # TODO: in development
 #opt userclass  STRING		# RFC 3004. set of LASCII strings. "I am a printer" etc
 #opt sipserv    STRING LIST	# RFC 3361. flag byte, then: 0: domain names, 1: IP addrs
-#opt staticroutes   STATIC_ROUTES
-#opt msstaticroutes STATIC_ROUTES
+
diff -Naur -x .svn busybox-1.19.3/networking/udhcp/common.c busybox-1.19.3-static-route/networking/udhcp/common.c
--- busybox-1.19.3/networking/udhcp/common.c	2011-09-06 03:35:17.000000000 +0100
+++ busybox-1.19.3-static-route/networking/udhcp/common.c	2011-12-16 08:53:58.302295297 +0000
@@ -54,12 +54,12 @@
 	{ OPTION_DNS_STRING | OPTION_LIST         , 0x77 }, /* DHCP_DOMAIN_SEARCH */
 	{ OPTION_SIP_SERVERS                      , 0x78 }, /* DHCP_SIP_SERVERS   */
 #endif
-	{ OPTION_STATIC_ROUTES                    , 0x79 }, /* DHCP_STATIC_ROUTES */
+	{ OPTION_STATIC_ROUTES | OPTION_LIST      , 0x79 }, /* DHCP_STATIC_ROUTES */
 #if ENABLE_FEATURE_UDHCP_8021Q
 	{ OPTION_U16                              , 0x84 }, /* DHCP_VLAN_ID       */
 	{ OPTION_U8                               , 0x85 }, /* DHCP_VLAN_PRIORITY */
 #endif
-	{ OPTION_STATIC_ROUTES                    , 0xf9 }, /* DHCP_MS_STATIC_ROUTES */
+	{ OPTION_STATIC_ROUTES | OPTION_LIST      , 0xf9 }, /* DHCP_MS_STATIC_ROUTES */
 	{ OPTION_STRING                           , 0xfc }, /* DHCP_WPAD          */

 	/* Options below have no match in dhcp_option_strings[],
@@ -119,8 +119,6 @@
 // is not handled yet by "string->option" conversion code:
 	"sipsrv" "\0"      /* DHCP_SIP_SERVERS    */
 #endif
-// doesn't work in udhcpd.conf since OPTION_STATIC_ROUTES
-// is not handled yet by "string->option" conversion code:
 	"staticroutes" "\0"/* DHCP_STATIC_ROUTES  */
 #if ENABLE_FEATURE_UDHCP_8021Q
 	"vlanid" "\0"      /* DHCP_VLAN_ID        */
@@ -331,7 +329,7 @@
 	lsa = host_and_af2sockaddr(str, 0, AF_INET);
 	if (!lsa)
 		return 0;
-	*(uint32_t*)arg = lsa->u.sin.sin_addr.s_addr;
+	memcpy(arg, &lsa->u.sin.sin_addr.s_addr, sizeof(uint32_t)); /* *arg maybe unaligned */
 	free(lsa);
 	return 1;
 }
@@ -434,7 +432,7 @@
 	struct dhcp_optflag bin_optflag;
 	unsigned optcode;
 	int retval, length;
-	char buffer[8] ALIGNED(4);
+	char buffer[9] ALIGNED(4);
 	uint16_t *result_u16 = (uint16_t *) buffer;
 	uint32_t *result_u32 = (uint32_t *) buffer;

@@ -521,9 +519,35 @@
 			retval = (endptr[0] == '\0');
 			break;
 		}
-		case OPTION_BIN: /* handled in attach_option() */
+		case OPTION_BIN: { /* handled in attach_option() */
 			opt = val;
 			retval = 1;
+			break;
+		}
+		case OPTION_STATIC_ROUTES: {
+			char *bits;
+
+			/* expect a.b.c.d/m format */
+			bits = strchr(val, '/');
+			if(!bits) {
+				retval = 0;
+			} else {
+				*bits = '\0';
+				buffer[0] = strtoul(bits + 1, NULL, 0);
+
+				retval = udhcp_str2nip(val, buffer + 1);
+				val = strtok(NULL, ", \t/-");
+				if (!val || (unsigned char)buffer[0] > 32)
+					retval = 0;
+
+				if (retval) {
+					length = ((buffer[0] + 7) >> 3) + 5;
+					retval = udhcp_str2nip(val, buffer + (length - 4));
+					opt = buffer;
+				}
+			}
+			break;
+		}
 		default:
 			break;
 		}


--
Mike


More information about the busybox mailing list