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:
parent
46f839c3f7
commit
f6dd9e0215
@ -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");
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user