Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2008 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | #include <stdlib.h> |
| 18 | #include <errno.h> |
| 19 | #include <fcntl.h> |
Olivier Bailly | ff2c0d8 | 2010-11-17 11:45:07 -0800 | [diff] [blame] | 20 | #include <string.h> |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 21 | |
| 22 | #include <sys/socket.h> |
| 23 | #include <sys/stat.h> |
Olivier Bailly | ff2c0d8 | 2010-11-17 11:45:07 -0800 | [diff] [blame] | 24 | #include <sys/ioctl.h> |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 25 | #include <sys/types.h> |
| 26 | #include <sys/wait.h> |
| 27 | |
| 28 | #include <netinet/in.h> |
| 29 | #include <arpa/inet.h> |
| 30 | |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 31 | #include <linux/wireless.h> |
| 32 | |
Kenny Root | a2d7e3e | 2010-03-15 14:26:36 -0700 | [diff] [blame] | 33 | #include <openssl/evp.h> |
| 34 | #include <openssl/sha.h> |
| 35 | |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 36 | #define LOG_TAG "SoftapController" |
| 37 | #include <cutils/log.h> |
Dmitry Shmidt | 389f8d1 | 2011-07-21 15:16:04 -0700 | [diff] [blame] | 38 | #include <netutils/ifc.h> |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 39 | #include <private/android_filesystem_config.h> |
Dmitry Shmidt | fe15b63 | 2011-07-19 13:55:25 -0700 | [diff] [blame] | 40 | #include "wifi.h" |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 41 | |
| 42 | #include "SoftapController.h" |
| 43 | |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 44 | static const char HOSTAPD_CONF_FILE[] = "/data/misc/wifi/hostapd.conf"; |
| 45 | |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 46 | SoftapController::SoftapController() { |
| 47 | mPid = 0; |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 48 | mSock = socket(AF_INET, SOCK_DGRAM, 0); |
| 49 | if (mSock < 0) |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 50 | ALOGE("Failed to open socket"); |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 51 | } |
| 52 | |
| 53 | SoftapController::~SoftapController() { |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 54 | if (mSock >= 0) |
| 55 | close(mSock); |
| 56 | } |
| 57 | |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 58 | int SoftapController::startSoftap() { |
| 59 | pid_t pid = 1; |
Dmitry Shmidt | 6665fb2 | 2010-09-22 17:31:07 -0700 | [diff] [blame] | 60 | int ret = 0; |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 61 | |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 62 | if (mPid) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 63 | ALOGE("Softap already started"); |
Dmitry Shmidt | a165913 | 2010-04-23 12:43:32 -0700 | [diff] [blame] | 64 | return 0; |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 65 | } |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 66 | if (mSock < 0) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 67 | ALOGE("Softap startap - failed to open socket"); |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 68 | return -1; |
| 69 | } |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 70 | |
Dmitry Shmidt | 389f8d1 | 2011-07-21 15:16:04 -0700 | [diff] [blame] | 71 | if ((pid = fork()) < 0) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 72 | ALOGE("fork failed (%s)", strerror(errno)); |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 73 | return -1; |
| 74 | } |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 75 | |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 76 | if (!pid) { |
Dmitry Shmidt | 01e182f | 2011-07-25 10:51:56 -0700 | [diff] [blame] | 77 | ensure_entropy_file_exists(); |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 78 | if (execl("/system/bin/hostapd", "/system/bin/hostapd", |
Dmitry Shmidt | 01e182f | 2011-07-25 10:51:56 -0700 | [diff] [blame] | 79 | "-e", WIFI_ENTROPY_FILE, |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 80 | HOSTAPD_CONF_FILE, (char *) NULL)) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 81 | ALOGE("execl failed (%s)", strerror(errno)); |
Dmitry Shmidt | 389f8d1 | 2011-07-21 15:16:04 -0700 | [diff] [blame] | 82 | } |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 83 | ALOGE("Should never get here!"); |
Dmitry Shmidt | 389f8d1 | 2011-07-21 15:16:04 -0700 | [diff] [blame] | 84 | return -1; |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 85 | } else { |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 86 | mPid = pid; |
| 87 | ALOGD("Softap startap - Ok"); |
| 88 | usleep(AP_BSS_START_DELAY); |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 89 | } |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 90 | return ret; |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 91 | |
| 92 | } |
| 93 | |
| 94 | int SoftapController::stopSoftap() { |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 95 | |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 96 | if (mPid == 0) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 97 | ALOGE("Softap already stopped"); |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 98 | return 0; |
| 99 | } |
Dmitry Shmidt | 389f8d1 | 2011-07-21 15:16:04 -0700 | [diff] [blame] | 100 | |
Steve Block | 7b984e3 | 2011-12-20 16:22:42 +0000 | [diff] [blame] | 101 | ALOGD("Stopping Softap service"); |
Dmitry Shmidt | 389f8d1 | 2011-07-21 15:16:04 -0700 | [diff] [blame] | 102 | kill(mPid, SIGTERM); |
| 103 | waitpid(mPid, NULL, 0); |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 104 | |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 105 | if (mSock < 0) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 106 | ALOGE("Softap stopap - failed to open socket"); |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 107 | return -1; |
| 108 | } |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 109 | mPid = 0; |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 110 | ALOGD("Softap service stopped"); |
Dmitry Shmidt | 3df450a | 2010-03-18 13:06:47 -0700 | [diff] [blame] | 111 | usleep(AP_BSS_STOP_DELAY); |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 112 | return 0; |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 113 | } |
| 114 | |
| 115 | bool SoftapController::isSoftapStarted() { |
| 116 | return (mPid != 0 ? true : false); |
| 117 | } |
| 118 | |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 119 | /* |
| 120 | * Arguments: |
| 121 | * argv[2] - wlan interface |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 122 | * argv[3] - SSID |
| 123 | * argv[4] - Security |
| 124 | * argv[5] - Key |
| 125 | * argv[6] - Channel |
| 126 | * argv[7] - Preamble |
| 127 | * argv[8] - Max SCB |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 128 | */ |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 129 | int SoftapController::setSoftap(int argc, char *argv[]) { |
Kenny Root | a2d7e3e | 2010-03-15 14:26:36 -0700 | [diff] [blame] | 130 | char psk_str[2*SHA256_DIGEST_LENGTH+1]; |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 131 | int ret = 0, i = 0, fd; |
Dmitry Shmidt | 6665fb2 | 2010-09-22 17:31:07 -0700 | [diff] [blame] | 132 | char *ssid, *iface; |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 133 | |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 134 | if (mSock < 0) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 135 | ALOGE("Softap set - failed to open socket"); |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 136 | return -1; |
| 137 | } |
| 138 | if (argc < 4) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 139 | ALOGE("Softap set - missing arguments"); |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 140 | return -1; |
| 141 | } |
| 142 | |
Dmitry Shmidt | 6665fb2 | 2010-09-22 17:31:07 -0700 | [diff] [blame] | 143 | iface = argv[2]; |
Dmitry Shmidt | 7977d67 | 2010-03-09 10:57:59 -0800 | [diff] [blame] | 144 | |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 145 | char *wbuf = NULL; |
| 146 | char *fbuf = NULL; |
| 147 | |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 148 | if (argc > 3) { |
| 149 | ssid = argv[3]; |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 150 | } else { |
| 151 | ssid = (char *)"AndroidAP"; |
| 152 | } |
| 153 | |
| 154 | asprintf(&wbuf, "interface=%s\ndriver=nl80211\nctrl_interface=" |
Dmitry Shmidt | 093e3c7 | 2012-03-16 12:33:34 -0700 | [diff] [blame] | 155 | "/data/misc/wifi/hostapd\nssid=%s\nchannel=6\nieee80211n=1\n", |
Dmitry Shmidt | fa81a80 | 2012-02-28 12:41:45 -0800 | [diff] [blame] | 156 | iface, ssid); |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 157 | |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 158 | if (argc > 4) { |
| 159 | if (!strcmp(argv[4], "wpa-psk")) { |
| 160 | generatePsk(ssid, argv[5], psk_str); |
Irfan Sheriff | 54b75b4 | 2011-10-25 20:37:18 -0700 | [diff] [blame] | 161 | asprintf(&fbuf, "%swpa=1\nwpa_pairwise=TKIP CCMP\nwpa_psk=%s\n", wbuf, psk_str); |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 162 | } else if (!strcmp(argv[4], "wpa2-psk")) { |
| 163 | generatePsk(ssid, argv[5], psk_str); |
Irfan Sheriff | 54b75b4 | 2011-10-25 20:37:18 -0700 | [diff] [blame] | 164 | asprintf(&fbuf, "%swpa=2\nrsn_pairwise=CCMP\nwpa_psk=%s\n", wbuf, psk_str); |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 165 | } else if (!strcmp(argv[4], "open")) { |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 166 | asprintf(&fbuf, "%s", wbuf); |
| 167 | } |
| 168 | } else { |
| 169 | asprintf(&fbuf, "%s", wbuf); |
| 170 | } |
| 171 | |
Robert Greenwalt | e064432 | 2012-11-29 10:51:33 -0800 | [diff] [blame^] | 172 | fd = open(HOSTAPD_CONF_FILE, O_CREAT | O_TRUNC | O_WRONLY | O_NOFOLLOW , 0660); |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 173 | if (fd < 0) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 174 | ALOGE("Cannot update \"%s\": %s", HOSTAPD_CONF_FILE, strerror(errno)); |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 175 | free(wbuf); |
| 176 | free(fbuf); |
| 177 | return -1; |
| 178 | } |
| 179 | if (write(fd, fbuf, strlen(fbuf)) < 0) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 180 | ALOGE("Cannot write to \"%s\": %s", HOSTAPD_CONF_FILE, strerror(errno)); |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 181 | ret = -1; |
| 182 | } |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 183 | free(wbuf); |
| 184 | free(fbuf); |
| 185 | |
| 186 | /* Note: apparently open can fail to set permissions correctly at times */ |
Robert Greenwalt | e064432 | 2012-11-29 10:51:33 -0800 | [diff] [blame^] | 187 | if (fchmod(fd, 0660) < 0) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 188 | ALOGE("Error changing permissions of %s to 0660: %s", |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 189 | HOSTAPD_CONF_FILE, strerror(errno)); |
Robert Greenwalt | e064432 | 2012-11-29 10:51:33 -0800 | [diff] [blame^] | 190 | close(fd); |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 191 | unlink(HOSTAPD_CONF_FILE); |
| 192 | return -1; |
| 193 | } |
| 194 | |
Robert Greenwalt | e064432 | 2012-11-29 10:51:33 -0800 | [diff] [blame^] | 195 | if (fchown(fd, AID_SYSTEM, AID_WIFI) < 0) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 196 | ALOGE("Error changing group ownership of %s to %d: %s", |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 197 | HOSTAPD_CONF_FILE, AID_WIFI, strerror(errno)); |
Robert Greenwalt | e064432 | 2012-11-29 10:51:33 -0800 | [diff] [blame^] | 198 | close(fd); |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 199 | unlink(HOSTAPD_CONF_FILE); |
| 200 | return -1; |
| 201 | } |
| 202 | |
Robert Greenwalt | e064432 | 2012-11-29 10:51:33 -0800 | [diff] [blame^] | 203 | close(fd); |
Dmitry Shmidt | 84c65a6 | 2010-03-03 13:14:30 -0800 | [diff] [blame] | 204 | return ret; |
Dmitry Shmidt | 5af38c3 | 2010-02-10 11:10:39 -0800 | [diff] [blame] | 205 | } |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 206 | |
Irfan Sheriff | 78dcb76 | 2011-07-22 15:20:21 -0700 | [diff] [blame] | 207 | void SoftapController::generatePsk(char *ssid, char *passphrase, char *psk_str) { |
| 208 | unsigned char psk[SHA256_DIGEST_LENGTH]; |
| 209 | int j; |
| 210 | // Use the PKCS#5 PBKDF2 with 4096 iterations |
| 211 | PKCS5_PBKDF2_HMAC_SHA1(passphrase, strlen(passphrase), |
| 212 | reinterpret_cast<const unsigned char *>(ssid), strlen(ssid), |
| 213 | 4096, SHA256_DIGEST_LENGTH, psk); |
| 214 | for (j=0; j < SHA256_DIGEST_LENGTH; j++) { |
| 215 | sprintf(&psk_str[j<<1], "%02x", psk[j]); |
| 216 | } |
| 217 | psk_str[j<<1] = '\0'; |
| 218 | } |
| 219 | |
| 220 | |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 221 | /* |
| 222 | * Arguments: |
| 223 | * argv[2] - interface name |
| 224 | * argv[3] - AP or STA |
| 225 | */ |
| 226 | int SoftapController::fwReloadSoftap(int argc, char *argv[]) |
| 227 | { |
Dmitry Shmidt | 6665fb2 | 2010-09-22 17:31:07 -0700 | [diff] [blame] | 228 | int ret, i = 0; |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 229 | char *iface; |
Dmitry Shmidt | fe15b63 | 2011-07-19 13:55:25 -0700 | [diff] [blame] | 230 | char *fwpath; |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 231 | |
| 232 | if (mSock < 0) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 233 | ALOGE("Softap fwrealod - failed to open socket"); |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 234 | return -1; |
| 235 | } |
| 236 | if (argc < 4) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 237 | ALOGE("Softap fwreload - missing arguments"); |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 238 | return -1; |
| 239 | } |
| 240 | |
| 241 | iface = argv[2]; |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 242 | |
| 243 | if (strcmp(argv[3], "AP") == 0) { |
Dmitry Shmidt | fe15b63 | 2011-07-19 13:55:25 -0700 | [diff] [blame] | 244 | fwpath = (char *)wifi_get_fw_path(WIFI_GET_FW_PATH_AP); |
Dmitry Shmidt | 54cf7fd | 2011-07-24 16:46:13 -0700 | [diff] [blame] | 245 | } else if (strcmp(argv[3], "P2P") == 0) { |
| 246 | fwpath = (char *)wifi_get_fw_path(WIFI_GET_FW_PATH_P2P); |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 247 | } else { |
Dmitry Shmidt | fe15b63 | 2011-07-19 13:55:25 -0700 | [diff] [blame] | 248 | fwpath = (char *)wifi_get_fw_path(WIFI_GET_FW_PATH_STA); |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 249 | } |
Dmitry Shmidt | fe15b63 | 2011-07-19 13:55:25 -0700 | [diff] [blame] | 250 | if (!fwpath) |
| 251 | return -1; |
Dmitry Shmidt | 389f8d1 | 2011-07-21 15:16:04 -0700 | [diff] [blame] | 252 | ret = wifi_change_fw_path((const char *)fwpath); |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 253 | if (ret) { |
Steve Block | 5ea0c05 | 2012-01-06 19:18:11 +0000 | [diff] [blame] | 254 | ALOGE("Softap fwReload - failed: %d", ret); |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 255 | } |
| 256 | else { |
Steve Block | 7b984e3 | 2011-12-20 16:22:42 +0000 | [diff] [blame] | 257 | ALOGD("Softap fwReload - Ok"); |
Dmitry Shmidt | 31fd6c5 | 2010-03-12 10:01:58 -0800 | [diff] [blame] | 258 | } |
| 259 | return ret; |
| 260 | } |
Dmitry Shmidt | 666fe25 | 2011-03-08 11:01:58 -0800 | [diff] [blame] | 261 | |
| 262 | int SoftapController::clientsSoftap(char **retbuf) |
| 263 | { |
Irfan Sheriff | 7e9eb7b | 2012-06-15 16:11:31 -0700 | [diff] [blame] | 264 | /* TODO: implement over hostapd */ |
| 265 | return 0; |
Dmitry Shmidt | 666fe25 | 2011-03-08 11:01:58 -0800 | [diff] [blame] | 266 | } |