[git commit] udhcpc6: fix for ppp interface type

Denys Vlasenko vda.linux at googlemail.com
Fri Jan 19 17:44:19 UTC 2018


commit: https://git.busybox.net/busybox/commit/?id=f6dd9e02155430a608e1b38036e355c045772d04
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

function                                             old     new   delta
d6_read_interface                                    454     600    +146

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 networking/udhcp/d6_dhcpc.c  |  4 ++--
 networking/udhcp/d6_socket.c | 27 ++++++++++++++++++++++-----
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c
index f3a7b82..07a8b11 100644
--- a/networking/udhcp/d6_dhcpc.c
+++ b/networking/udhcp/d6_dhcpc.c
@@ -1093,6 +1093,8 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
 	int retval;
 
 	setup_common_bufsiz();
+	/* We want random_xid to be random */
+	srand(monotonic_us());
 
 	/* Default options */
 	IF_FEATURE_UDHCP_PORT(SERVER_PORT6 = 547;)
@@ -1207,8 +1209,6 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
 	bb_error_msg("started, v"BB_VER);
 	/* Set up the signal pipe */
 	udhcp_sp_setup();
-	/* We want random_xid to be random... */
-	srand(monotonic_us());
 
 	state = INIT_SELECTING;
 	d6_run_script(NULL, "deconfig");
diff --git a/networking/udhcp/d6_socket.c b/networking/udhcp/d6_socket.c
index d00c217..f9082ee 100644
--- a/networking/udhcp/d6_socket.c
+++ b/networking/udhcp/d6_socket.c
@@ -16,7 +16,6 @@ int FAST_FUNC d6_read_interface(const char *interface, int *ifindex, struct in6_
 	struct ifaddrs *ifap, *ifa;
 
 	getifaddrs(&ifap);
-
 	for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
 		struct sockaddr_in6 *sip6;
 
@@ -29,9 +28,9 @@ int FAST_FUNC d6_read_interface(const char *interface, int *ifindex, struct in6_
 			struct sockaddr_ll *sll = (struct sockaddr_ll*)(ifa->ifa_addr);
 			memcpy(mac, sll->sll_addr, 6);
 			log2("MAC %02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
-			log2("ifindex %d", sll->sll_ifindex);
 			*ifindex = sll->sll_ifindex;
-			retval &= (0xf - (1<<0));
+			log2("ifindex %d", *ifindex);
+			retval &= (3 - (1<<0));
 		}
 #if 0
 		if (ifa->ifa_addr->sa_family == AF_INET) {
@@ -54,11 +53,29 @@ int FAST_FUNC d6_read_interface(const char *interface, int *ifindex, struct in6_
 				nip6->s6_addr[12], nip6->s6_addr[13],
 				nip6->s6_addr[14], nip6->s6_addr[15]
 			);
-			retval &= (0xf - (1<<1));
+			retval &= (3 - (1<<1));
 		}
 	}
-
 	freeifaddrs(ifap);
+
+	if (retval & (1<<0)) {
+		/* This iface has no MAC (e.g. ppp), generate a random one */
+		struct ifreq ifr;
+		int fd;
+
+		memset(&ifr, 0, sizeof(ifr));
+		strncpy_IFNAMSIZ(ifr.ifr_name, interface);
+		fd = xsocket(AF_INET6, SOCK_RAW, IPPROTO_RAW);
+		if (ioctl(fd, SIOCGIFINDEX, &ifr) == 0) {
+			*ifindex = ifr.ifr_ifindex;
+			log2("ifindex %d", *ifindex);
+			((uint32_t*)mac)[0] = rand();
+			((uint16_t*)mac)[2] = rand();
+			retval &= (3 - (1<<0));
+		}
+		close(fd);
+	}
+
 	if (retval == 0)
 		return retval;
 


More information about the busybox-cvs mailing list