aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2018-01-19 18:44:19 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2018-01-19 18:44:19 +0100
commitf6dd9e02155430a608e1b38036e355c045772d04 (patch)
treed7d66dd176a5ea3a01deeeb4ba906f8a12e49a60 /networking/udhcp
parent46f839c3f7476cb9016c4787729f64a2c24509d1 (diff)
downloadbusybox-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.c4
-rw-r--r--networking/udhcp/d6_socket.c27
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