udhcpc6: fix for ppp interface type

function                                             old     new   delta
d6_read_interface                                    454     600    +146

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-01-19 18:44:19 +01:00
parent 46f839c3f7
commit f6dd9e0215
2 changed files with 24 additions and 7 deletions

View File

@ -1093,6 +1093,8 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
int retval; int retval;
setup_common_bufsiz(); setup_common_bufsiz();
/* We want random_xid to be random */
srand(monotonic_us());
/* Default options */ /* Default options */
IF_FEATURE_UDHCP_PORT(SERVER_PORT6 = 547;) 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); bb_error_msg("started, v"BB_VER);
/* Set up the signal pipe */ /* Set up the signal pipe */
udhcp_sp_setup(); udhcp_sp_setup();
/* We want random_xid to be random... */
srand(monotonic_us());
state = INIT_SELECTING; state = INIT_SELECTING;
d6_run_script(NULL, "deconfig"); d6_run_script(NULL, "deconfig");

View File

@ -16,7 +16,6 @@ int FAST_FUNC d6_read_interface(const char *interface, int *ifindex, struct in6_
struct ifaddrs *ifap, *ifa; struct ifaddrs *ifap, *ifa;
getifaddrs(&ifap); getifaddrs(&ifap);
for (ifa = ifap; ifa; ifa = ifa->ifa_next) { for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
struct sockaddr_in6 *sip6; 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); struct sockaddr_ll *sll = (struct sockaddr_ll*)(ifa->ifa_addr);
memcpy(mac, sll->sll_addr, 6); 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("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; *ifindex = sll->sll_ifindex;
retval &= (0xf - (1<<0)); log2("ifindex %d", *ifindex);
retval &= (3 - (1<<0));
} }
#if 0 #if 0
if (ifa->ifa_addr->sa_family == AF_INET) { 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[12], nip6->s6_addr[13],
nip6->s6_addr[14], nip6->s6_addr[15] nip6->s6_addr[14], nip6->s6_addr[15]
); );
retval &= (0xf - (1<<1)); retval &= (3 - (1<<1));
} }
} }
freeifaddrs(ifap); 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) if (retval == 0)
return retval; return retval;