[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