udhcpc6: fix for ppp interface type
No binary (build failed)
—
(log yok)
| @@ -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"); | |
| @@ -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; | |