From: Denys Vlasenko Date: Fri, 19 Jan 2018 17:44:19 +0000 (+0100) Subject: udhcpc6: fix for ppp interface type X-Git-Tag: 1_29_0~348 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=f6dd9e02155430a608e1b38036e355c045772d04;p=oweals%2Fbusybox.git udhcpc6: fix for ppp interface type function old new delta d6_read_interface 454 600 +146 Signed-off-by: Denys Vlasenko --- diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c index f3a7b827c..07a8b11c1 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 d00c217d6..f9082ee9d 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;