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 | |
parent | 46f839c3f7476cb9016c4787729f64a2c24509d1 (diff) | |
download | busybox-w32-f6dd9e02155430a608e1b38036e355c045772d04.tar.gz busybox-w32-f6dd9e02155430a608e1b38036e355c045772d04.tar.bz2 busybox-w32-f6dd9e02155430a608e1b38036e355c045772d04.zip |
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')
-rw-r--r-- | networking/udhcp/d6_dhcpc.c | 4 | ||||
-rw-r--r-- | networking/udhcp/d6_socket.c | 27 |
2 files changed, 24 insertions, 7 deletions
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) | |||
1093 | int retval; | 1093 | int retval; |
1094 | 1094 | ||
1095 | setup_common_bufsiz(); | 1095 | setup_common_bufsiz(); |
1096 | /* We want random_xid to be random */ | ||
1097 | srand(monotonic_us()); | ||
1096 | 1098 | ||
1097 | /* Default options */ | 1099 | /* Default options */ |
1098 | IF_FEATURE_UDHCP_PORT(SERVER_PORT6 = 547;) | 1100 | IF_FEATURE_UDHCP_PORT(SERVER_PORT6 = 547;) |
@@ -1207,8 +1209,6 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) | |||
1207 | bb_error_msg("started, v"BB_VER); | 1209 | bb_error_msg("started, v"BB_VER); |
1208 | /* Set up the signal pipe */ | 1210 | /* Set up the signal pipe */ |
1209 | udhcp_sp_setup(); | 1211 | udhcp_sp_setup(); |
1210 | /* We want random_xid to be random... */ | ||
1211 | srand(monotonic_us()); | ||
1212 | 1212 | ||
1213 | state = INIT_SELECTING; | 1213 | state = INIT_SELECTING; |
1214 | d6_run_script(NULL, "deconfig"); | 1214 | 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_ | |||
16 | struct ifaddrs *ifap, *ifa; | 16 | struct ifaddrs *ifap, *ifa; |
17 | 17 | ||
18 | getifaddrs(&ifap); | 18 | getifaddrs(&ifap); |
19 | |||
20 | for (ifa = ifap; ifa; ifa = ifa->ifa_next) { | 19 | for (ifa = ifap; ifa; ifa = ifa->ifa_next) { |
21 | struct sockaddr_in6 *sip6; | 20 | struct sockaddr_in6 *sip6; |
22 | 21 | ||
@@ -29,9 +28,9 @@ int FAST_FUNC d6_read_interface(const char *interface, int *ifindex, struct in6_ | |||
29 | struct sockaddr_ll *sll = (struct sockaddr_ll*)(ifa->ifa_addr); | 28 | struct sockaddr_ll *sll = (struct sockaddr_ll*)(ifa->ifa_addr); |
30 | memcpy(mac, sll->sll_addr, 6); | 29 | memcpy(mac, sll->sll_addr, 6); |
31 | log2("MAC %02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); | 30 | log2("MAC %02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); |
32 | log2("ifindex %d", sll->sll_ifindex); | ||
33 | *ifindex = sll->sll_ifindex; | 31 | *ifindex = sll->sll_ifindex; |
34 | retval &= (0xf - (1<<0)); | 32 | log2("ifindex %d", *ifindex); |
33 | retval &= (3 - (1<<0)); | ||
35 | } | 34 | } |
36 | #if 0 | 35 | #if 0 |
37 | if (ifa->ifa_addr->sa_family == AF_INET) { | 36 | 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_ | |||
54 | nip6->s6_addr[12], nip6->s6_addr[13], | 53 | nip6->s6_addr[12], nip6->s6_addr[13], |
55 | nip6->s6_addr[14], nip6->s6_addr[15] | 54 | nip6->s6_addr[14], nip6->s6_addr[15] |
56 | ); | 55 | ); |
57 | retval &= (0xf - (1<<1)); | 56 | retval &= (3 - (1<<1)); |
58 | } | 57 | } |
59 | } | 58 | } |
60 | |||
61 | freeifaddrs(ifap); | 59 | freeifaddrs(ifap); |
60 | |||
61 | if (retval & (1<<0)) { | ||
62 | /* This iface has no MAC (e.g. ppp), generate a random one */ | ||
63 | struct ifreq ifr; | ||
64 | int fd; | ||
65 | |||
66 | memset(&ifr, 0, sizeof(ifr)); | ||
67 | strncpy_IFNAMSIZ(ifr.ifr_name, interface); | ||
68 | fd = xsocket(AF_INET6, SOCK_RAW, IPPROTO_RAW); | ||
69 | if (ioctl(fd, SIOCGIFINDEX, &ifr) == 0) { | ||
70 | *ifindex = ifr.ifr_ifindex; | ||
71 | log2("ifindex %d", *ifindex); | ||
72 | ((uint32_t*)mac)[0] = rand(); | ||
73 | ((uint16_t*)mac)[2] = rand(); | ||
74 | retval &= (3 - (1<<0)); | ||
75 | } | ||
76 | close(fd); | ||
77 | } | ||
78 | |||
62 | if (retval == 0) | 79 | if (retval == 0) |
63 | return retval; | 80 | return retval; |
64 | 81 | ||