SoftapController.cpp revision 31fd6c5f3e9c39a13b028718dba5921a4300988c
15af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt/* 25af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * Copyright (C) 2008 The Android Open Source Project 35af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * 45af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * Licensed under the Apache License, Version 2.0 (the "License"); 55af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * you may not use this file except in compliance with the License. 65af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * You may obtain a copy of the License at 75af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * 85af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * http://www.apache.org/licenses/LICENSE-2.0 95af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * 105af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * Unless required by applicable law or agreed to in writing, software 115af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * distributed under the License is distributed on an "AS IS" BASIS, 125af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * See the License for the specific language governing permissions and 145af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt * limitations under the License. 155af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt */ 165af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 175af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include <stdlib.h> 185af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include <errno.h> 195af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include <fcntl.h> 205af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 215af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include <sys/socket.h> 225af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include <sys/stat.h> 235af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include <sys/types.h> 245af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include <sys/wait.h> 255af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 265af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include <netinet/in.h> 275af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include <arpa/inet.h> 285af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 2984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt#include <linux/wireless.h> 3084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 315af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#define LOG_TAG "SoftapController" 325af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include <cutils/log.h> 335af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 345af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include "SoftapController.h" 35321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt#include "sha1.h" 365af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 375af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController::SoftapController() { 385af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt mPid = 0; 3984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt mSock = socket(AF_INET, SOCK_DGRAM, 0); 4084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (mSock < 0) 4184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("Failed to open socket"); 4284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt memset(mIface, 0, sizeof(mIface)); 435af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 445af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 455af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController::~SoftapController() { 4684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (mSock >= 0) 4784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt close(mSock); 4884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt} 4984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 5084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidtint SoftapController::getPrivFuncNum(char *iface, const char *fname) { 5184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt struct iwreq wrq; 5284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt struct iw_priv_args *priv_ptr; 5384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt int i, ret; 5484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 5584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt strncpy(wrq.ifr_name, iface, sizeof(wrq.ifr_name)); 5684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.pointer = mBuf; 5784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.length = sizeof(mBuf) / sizeof(struct iw_priv_args); 5884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.flags = 0; 5984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if ((ret = ioctl(mSock, SIOCGIWPRIV, &wrq)) < 0) { 6084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("SIOCGIPRIV failed: %d", ret); 6184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return ret; 6284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 6384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt priv_ptr = (struct iw_priv_args *)wrq.u.data.pointer; 6484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt for(i=0;(i < wrq.u.data.length);i++) { 6584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (strcmp(priv_ptr[i].name, fname) == 0) 6684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return priv_ptr[i].cmd; 6784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 6884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 695af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 705af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 715af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint SoftapController::startSoftap() { 7284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt struct iwreq wrq; 735af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt pid_t pid = 1; 7484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt int fnum, ret = 0; 755af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 765af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt LOGD("Softap start"); 775af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (mPid) { 785af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt LOGE("Softap already started"); 795af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt errno = EBUSY; 805af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return -1; 815af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 8284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (mSock < 0) { 8384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("Failed to open socket"); 8484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 8584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 865af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#if 0 875af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if ((pid = fork()) < 0) { 885af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt LOGE("fork failed (%s)", strerror(errno)); 895af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return -1; 905af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 915af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#endif 9284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt /* system("iwpriv wl0.1 AP_BSS_START"); */ 935af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!pid) { 9484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt /* start hostapd */ 9584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return ret; 965af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 9784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt fnum = getPrivFuncNum(mIface, "AP_BSS_START"); 9884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (fnum < 0) { 9984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("Softap start - function not supported"); 10084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 10184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 10284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt strncpy(wrq.ifr_name, mIface, sizeof(wrq.ifr_name)); 10384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.length = 0; 10484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.pointer = mBuf; 10584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.flags = 0; 10684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt ret = ioctl(mSock, fnum, &wrq); 10784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (ret) { 10884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("Softap start - failed: %d", ret); 10984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 11084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt else { 11184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt mPid = pid; 11284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGD("Softap start - Ok"); 11384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 1145af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 11584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return ret; 1165af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 1175af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 1185af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 1195af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint SoftapController::stopSoftap() { 12084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt struct iwreq wrq; 12184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt int fnum, ret; 12284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 1235af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (mPid == 0) { 1245af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt LOGE("Softap already stopped"); 1255af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 1265af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 12784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (mSock < 0) { 1287977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt LOGE("Softap stop - failed to open socket"); 12984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 13084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 13184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt fnum = getPrivFuncNum(mIface, "WL_AP_STOP"); 13284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (fnum < 0) { 13384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("Softap stop - function not supported"); 13484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 13584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 13684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt strncpy(wrq.ifr_name, mIface, sizeof(wrq.ifr_name)); 13784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.length = 0; 13884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.pointer = mBuf; 13984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.flags = 0; 14084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt ret = ioctl(mSock, fnum, &wrq); 1415af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#if 0 1425af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt LOGD("Stopping Softap service"); 1435af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt kill(mPid, SIGTERM); 1445af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt waitpid(mPid, NULL, 0); 1455af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#endif 1465af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt mPid = 0; 14784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGD("Softap service stopped: %d", ret); 14884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return ret; 1495af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 1505af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 1515af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtbool SoftapController::isSoftapStarted() { 1525af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return (mPid != 0 ? true : false); 1535af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 1545af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 1557977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidtint SoftapController::addParam(int pos, const char *cmd, const char *arg) 1567977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt{ 1577977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (pos < 0) 1587977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt return pos; 1597977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if ((unsigned)(pos + strlen(cmd) + strlen(arg) + 1) >= sizeof(mBuf)) { 1607977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt LOGE("Command line is too big"); 1617977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt return -1; 1627977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 1637977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt pos += sprintf(&mBuf[pos], "%s=%s,", cmd, arg); 1647977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt return pos; 1657977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt} 1667977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt 16784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt/* 16884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt * Arguments: 16984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt * argv[2] - wlan interface 17084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt * argv[3] - softap interface 1717977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[4] - SSID 1727977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[5] - Security 1737977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[6] - Key 1747977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[7] - Channel 1757977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[8] - Preamble 1767977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[9] - Max SCB 17784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt */ 1785af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint SoftapController::setSoftap(int argc, char *argv[]) { 179321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt unsigned char psk[MAX_SHA1_LEN]; 180321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt char psk_str[2*MAX_SHA1_LEN+1]; 18184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt struct iwreq wrq; 1827977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt int fnum, ret, i = 0; 183321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt char *ssid; 18484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 18584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (mSock < 0) { 1867977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt LOGE("Softap set - failed to open socket"); 18784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 18884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 18984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (argc < 4) { 1907977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt LOGE("Softap set - missing arguments"); 19184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 19284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 19384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 19484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt fnum = getPrivFuncNum(argv[2], "WL_AP_CFG"); 19584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (fnum < 0) { 19684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("Softap set - function not supported"); 19784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 19884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 19984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 20084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt strncpy(mIface, argv[3], sizeof(mIface)); 20184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt strncpy(wrq.ifr_name, argv[2], sizeof(wrq.ifr_name)); 2027977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt 2037977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt /* Create command line */ 2047977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "ASCII_CMD", "AP_CFG"); 2057977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 4) { 206321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt ssid = argv[4]; 2077977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 208321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt ssid = (char *)"AndroidAP"; 2097977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 210321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt i = addParam(i, "SSID", ssid); 2117977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 5) { 2127977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "SEC", argv[5]); 2137977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 2147977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "SEC", "open"); 2157977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 2167977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 6) { 217321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt int j; 218321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt pbkdf2_sha1(argv[6], ssid, strlen(ssid), 4096, psk, MAX_SHA1_LEN); 219321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt for(j=0;(j < MAX_SHA1_LEN);j++) { 220321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt sprintf(&psk_str[j<<1], "%02x", psk[j]); 221321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt } 222321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt psk_str[j<<1] = '\0'; 223321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt i = addParam(i, "KEY", psk_str); 2247977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 2257977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "KEY", "12345678"); 2267977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 2277977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 7) { 2287977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "CHANNEL", argv[7]); 2297977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 2307977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "CHANNEL", "6"); 2317977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 2327977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 8) { 2337977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "PREAMBLE", argv[8]); 2347977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 2357977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "PREAMBLE", "0"); 2367977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 2377977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 9) { 2387977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "MAX_SCB", argv[9]); 2397977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 2407977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "MAX_SCB", "8"); 2417977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 2427977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if ((i < 0) || ((unsigned)(i + 4) >= sizeof(mBuf))) { 2437977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt LOGE("Softap set - command is too big"); 2447977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt return i; 24584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 2467977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt sprintf(&mBuf[i], "END"); 24784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 24884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.length = strlen(mBuf) + 1; 24984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.pointer = mBuf; 25084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.flags = 0; 25184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt /* system("iwpriv eth0 WL_AP_CFG ASCII_CMD=AP_CFG,SSID=\"AndroidAP\",SEC=\"open\",KEY=12345,CHANNEL=1,PREAMBLE=0,MAX_SCB=8,END"); */ 25284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt ret = ioctl(mSock, fnum, &wrq); 25384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (ret) { 25484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("Softap set - failed: %d", ret); 25584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 25684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt else { 25784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGD("Softap set - Ok"); 25884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 25984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return ret; 2605af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 26131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt 26231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt/* 26331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt * Arguments: 26431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt * argv[2] - interface name 26531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt * argv[3] - AP or STA 26631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt */ 26731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidtint SoftapController::fwReloadSoftap(int argc, char *argv[]) 26831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt{ 26931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt struct iwreq wrq; 27031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt int fnum, ret, i = 0; 27131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt char *iface; 27231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt 27331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt if (mSock < 0) { 27431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt LOGE("Softap fwrealod - failed to open socket"); 27531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt return -1; 27631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 27731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt if (argc < 4) { 27831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt LOGE("Softap fwreload - missing arguments"); 27931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt return -1; 28031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 28131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt 28231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt iface = argv[2]; 28331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt fnum = getPrivFuncNum(iface, "WL_FW_RELOAD"); 28431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt if (fnum < 0) { 28531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt LOGE("Softap fwReload - function not supported"); 28631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt return -1; 28731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 28831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt 28931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt if (strcmp(argv[3], "AP") == 0) { 29031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt#ifdef WIFI_DRIVER_FW_AP_PATH 29131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt sprintf(mBuf, "FW_PATH=%s", WIFI_DRIVER_FW_AP_PATH); 29231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt#endif 29331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else { 29431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt#ifdef WIFI_DRIVER_FW_STA_PATH 29531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt sprintf(mBuf, "FW_PATH=%s", WIFI_DRIVER_FW_STA_PATH); 29631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt#endif 29731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 29831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt strncpy(wrq.ifr_name, iface, sizeof(wrq.ifr_name)); 29931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt wrq.u.data.length = strlen(mBuf) + 1; 30031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt wrq.u.data.pointer = mBuf; 30131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt wrq.u.data.flags = 0; 30231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt ret = ioctl(mSock, fnum, &wrq); 30331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt if (ret) { 30431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt LOGE("Softap fwReload - failed: %d", ret); 30531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 30631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt else { 30731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt LOGD("Softap fwReload - Ok"); 30831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 30931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt return ret; 31031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt} 311