diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-01-19 18:44:19 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-01-19 18:44:19 +0100 |
commit | f6dd9e02155430a608e1b38036e355c045772d04 (patch) | |
tree | d7d66dd176a5ea3a01deeeb4ba906f8a12e49a60 /networking/udhcp/d6_socket.c | |
parent | 46f839c3f7476cb9016c4787729f64a2c24509d1 (diff) |
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>
Diffstat (limited to 'networking/udhcp/d6_socket.c')
-rw-r--r-- | networking/udhcp/d6_socket.c | 27 |
1 files changed, 22 insertions, 5 deletions
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; |