[PATCH 2/3] zcip: allow our own class B range to be used for ZeroConf

Stam, Michel [FINT] M.Stam at fugro.nl
Wed Oct 15 06:46:17 UTC 2014


Does anyone have time to look at this?

Kind regards,

Michel Stam
-----Original Message-----
From: Michel Stam [mailto:m.stam at fugro.nl] 
Sent: Wednesday, October 08, 2014 14:45 PM
To: busybox at busybox.net
Cc: Stam, Michel [FINT]
Subject: [PATCH 2/3] zcip: allow our own class B range to be used for
ZeroConf

169.254 may already be used by a local network. This patch allows
specifying your own IP range.

Signed-off-by: Michel Stam <m.stam at fugro.nl>
---
 networking/zcip.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/networking/zcip.c b/networking/zcip.c index
45d1f7c..2a57543 100644
--- a/networking/zcip.c
+++ b/networking/zcip.c
@@ -30,6 +30,7 @@
 //usage:     "\n	-f		Run in foreground"
 //usage:     "\n	-q		Quit after obtaining address"
 //usage:     "\n	-r 169.254.x.x	Request this address first"
+//usage:     "\n	-l w.x.0.0	Use this class B range instead
of 169.254"
 //usage:     "\n	-v		Verbose"
 //usage:     "\n"
 //usage:     "\nWith no -q, runs continuously monitoring for ARP
conflicts,"
@@ -87,10 +88,12 @@ enum {
 struct globals {
 	struct sockaddr saddr;
 	struct ether_addr eth_addr;
+	uint32_t localnet_addr;
 } FIX_ALIASING;
 #define G (*(struct globals*)&bb_common_bufsiz1)
 #define saddr    (G.saddr   )
 #define eth_addr (G.eth_addr)
+#define localnet_addr (G.localnet_addr)
 #define INIT_G() do { } while (0)
 
 
@@ -105,7 +108,7 @@ static uint32_t pick(void)
 	do {
 		tmp = rand() & IN_CLASSB_HOST;
 	} while (tmp > (IN_CLASSB_HOST - 0x0200));
-	return htonl((LINKLOCAL_ADDR + 0x0100) + tmp);
+	return htonl((localnet_addr + 0x0100) + tmp);
 }
 
 /**
@@ -197,6 +200,7 @@ int zcip_main(int argc UNUSED_PARAM, char **argv)  {
 	int state;
 	char *r_opt;
+	char *l_opt;
 	unsigned opts;
 
 	// ugly trick, but I want these zeroed in one go @@ -204,6
+208,7 @@ int zcip_main(int argc UNUSED_PARAM, char **argv)
 		const struct in_addr null_ip;
 		const struct ether_addr null_addr;
 		struct in_addr ip;
+		struct in_addr net;
 		struct ifreq ifr;
 		int timeout_ms; /* must be signed */
 		unsigned conflicts;
@@ -215,6 +220,7 @@ int zcip_main(int argc UNUSED_PARAM, char **argv)
 #define null_ip    (L.null_ip   )
 #define null_addr  (L.null_addr )
 #define ip         (L.ip        )
+#define net        (L.net       )
 #define ifr        (L.ifr       )
 #define timeout_ms (L.timeout_ms)
 #define conflicts  (L.conflicts )
@@ -224,6 +230,7 @@ int zcip_main(int argc UNUSED_PARAM, char **argv)
 #define verbose    (L.verbose   )
 
 	memset(&L, 0, sizeof(L));
+	localnet_addr = LINKLOCAL_ADDR; // Assume default 169.254.x.x
 	INIT_G();
 
 #define FOREGROUND (opts & 1)
@@ -231,7 +238,7 @@ int zcip_main(int argc UNUSED_PARAM, char **argv)
 	// parse commandline: prog [options] ifname script
 	// exactly 2 args; -v accumulates and implies -f
 	opt_complementary = "=2:vv:vf";
-	opts = getopt32(argv, "fqr:v", &r_opt, &verbose);
+	opts = getopt32(argv, "fqr:l:v", &r_opt, &l_opt, &verbose);
 #if !BB_MMU
 	// on NOMMU reexec early (or else we will rerun things twice)
 	if (!FOREGROUND)
@@ -246,9 +253,17 @@ int zcip_main(int argc UNUSED_PARAM, char **argv)
 		openlog(applet_name, 0, LOG_DAEMON);
 		logmode |= LOGMODE_SYSLOG;
 	}
+	if (opts & 8) { // -l n.n.n.n
+		if (inet_aton(l_opt, &net) == 0
+		 || (net.s_addr & htonl(IN_CLASSB_NET)) != net.s_addr
+		) {
+			bb_error_msg_and_die("invalid network address");
+		}
+		localnet_addr = ntohl(net.s_addr);
+	}
 	if (opts & 4) { // -r n.n.n.n
 		if (inet_aton(r_opt, &ip) == 0
-		 || (ntohl(ip.s_addr) & IN_CLASSB_NET) != LINKLOCAL_ADDR
+		 || (ntohl(ip.s_addr) & IN_CLASSB_NET) != localnet_addr
 		) {
 			bb_error_msg_and_die("invalid link address");
 		}
--
1.7.12.1



More information about the busybox mailing list