SoftapController.cpp revision a165913421c5bed00a1f0b8e79e35e55b82aebbe
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 31a2d7e3e7d6e3f163f06e522378c6e2bd5cee28f8Kenny Root#include <openssl/evp.h> 32a2d7e3e7d6e3f163f06e522378c6e2bd5cee28f8Kenny Root#include <openssl/sha.h> 33a2d7e3e7d6e3f163f06e522378c6e2bd5cee28f8Kenny Root 345af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#define LOG_TAG "SoftapController" 355af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include <cutils/log.h> 365af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 375af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#include "SoftapController.h" 385af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 395af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController::SoftapController() { 405af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt mPid = 0; 4184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt mSock = socket(AF_INET, SOCK_DGRAM, 0); 4284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (mSock < 0) 4384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("Failed to open socket"); 4484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt memset(mIface, 0, sizeof(mIface)); 455af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 465af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 475af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController::~SoftapController() { 4884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (mSock >= 0) 4984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt close(mSock); 5084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt} 5184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 5284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidtint SoftapController::getPrivFuncNum(char *iface, const char *fname) { 5384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt struct iwreq wrq; 5484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt struct iw_priv_args *priv_ptr; 5584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt int i, ret; 5684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 5784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt strncpy(wrq.ifr_name, iface, sizeof(wrq.ifr_name)); 5884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.pointer = mBuf; 5984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.length = sizeof(mBuf) / sizeof(struct iw_priv_args); 6084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.flags = 0; 6184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if ((ret = ioctl(mSock, SIOCGIWPRIV, &wrq)) < 0) { 6284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("SIOCGIPRIV failed: %d", ret); 6384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return ret; 6484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 6584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt priv_ptr = (struct iw_priv_args *)wrq.u.data.pointer; 6684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt for(i=0;(i < wrq.u.data.length);i++) { 6784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (strcmp(priv_ptr[i].name, fname) == 0) 6884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return priv_ptr[i].cmd; 6984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 7084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 715af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 725af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 73c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidtint SoftapController::startDriver(char *iface) { 74c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt struct iwreq wrq; 75c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt int fnum, ret; 76c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt 77c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt if (mSock < 0) { 78a165913421c5bed00a1f0b8e79e35e55b82aebbeDmitry Shmidt LOGE("Softap driver start - failed to open socket"); 79c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt return -1; 80c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } 81c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt if (!iface || (iface[0] == '\0')) { 82a165913421c5bed00a1f0b8e79e35e55b82aebbeDmitry Shmidt LOGD("Softap driver start - wrong interface"); 83c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt iface = mIface; 84c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } 85c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt fnum = getPrivFuncNum(iface, "START"); 86c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt if (fnum < 0) { 87a165913421c5bed00a1f0b8e79e35e55b82aebbeDmitry Shmidt LOGE("Softap driver start - function not supported"); 88c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt return -1; 89c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } 90c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt strncpy(wrq.ifr_name, iface, sizeof(wrq.ifr_name)); 91c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt wrq.u.data.length = 0; 92c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt wrq.u.data.pointer = mBuf; 93c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt wrq.u.data.flags = 0; 94c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt ret = ioctl(mSock, fnum, &wrq); 95a165913421c5bed00a1f0b8e79e35e55b82aebbeDmitry Shmidt usleep(AP_DRIVER_START_DELAY); 96a165913421c5bed00a1f0b8e79e35e55b82aebbeDmitry Shmidt LOGD("Softap driver start: %d", ret); 97c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt return ret; 98c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt} 99c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt 100c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidtint SoftapController::stopDriver(char *iface) { 101c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt struct iwreq wrq; 102c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt int fnum, ret; 103c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt 104c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt if (mSock < 0) { 105a165913421c5bed00a1f0b8e79e35e55b82aebbeDmitry Shmidt LOGE("Softap driver stop - failed to open socket"); 106c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt return -1; 107c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } 108c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt if (!iface || (iface[0] == '\0')) { 109a165913421c5bed00a1f0b8e79e35e55b82aebbeDmitry Shmidt LOGD("Softap driver stop - wrong interface"); 110c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt iface = mIface; 111c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } 112c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt fnum = getPrivFuncNum(iface, "STOP"); 113c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt if (fnum < 0) { 114a165913421c5bed00a1f0b8e79e35e55b82aebbeDmitry Shmidt LOGE("Softap driver stop - function not supported"); 115c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt return -1; 116c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } 117c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt strncpy(wrq.ifr_name, iface, sizeof(wrq.ifr_name)); 118c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt wrq.u.data.length = 0; 119c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt wrq.u.data.pointer = mBuf; 120c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt wrq.u.data.flags = 0; 121c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt ret = ioctl(mSock, fnum, &wrq); 122a165913421c5bed00a1f0b8e79e35e55b82aebbeDmitry Shmidt LOGD("Softap driver stop: %d", ret); 123c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt return ret; 124c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt} 125c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt 1265af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint SoftapController::startSoftap() { 12784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt struct iwreq wrq; 1285af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt pid_t pid = 1; 12984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt int fnum, ret = 0; 1305af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 1315af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (mPid) { 1325af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt LOGE("Softap already started"); 133a165913421c5bed00a1f0b8e79e35e55b82aebbeDmitry Shmidt return 0; 1345af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 13584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (mSock < 0) { 136c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt LOGE("Softap startap - failed to open socket"); 13784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 13884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 1395af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#if 0 1405af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if ((pid = fork()) < 0) { 1415af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt LOGE("fork failed (%s)", strerror(errno)); 1425af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return -1; 1435af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 1445af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#endif 14584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt /* system("iwpriv wl0.1 AP_BSS_START"); */ 1465af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!pid) { 14784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt /* start hostapd */ 14884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return ret; 1495af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 15084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt fnum = getPrivFuncNum(mIface, "AP_BSS_START"); 15184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (fnum < 0) { 152c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt LOGE("Softap startap - function not supported"); 15384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 15484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 15584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt strncpy(wrq.ifr_name, mIface, sizeof(wrq.ifr_name)); 15684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.length = 0; 15784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.pointer = mBuf; 15884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.flags = 0; 15984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt ret = ioctl(mSock, fnum, &wrq); 16084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (ret) { 161c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt LOGE("Softap startap - failed: %d", ret); 16284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 16384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt else { 16484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt mPid = pid; 165c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt LOGD("Softap startap - Ok"); 1663df450af1c2e35d854768a508b6905c6794f7a74Dmitry Shmidt usleep(AP_BSS_START_DELAY); 16784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 1685af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 16984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return ret; 1705af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 1715af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 1725af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 1735af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint SoftapController::stopSoftap() { 17484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt struct iwreq wrq; 17584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt int fnum, ret; 17684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 1775af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (mPid == 0) { 1785af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt LOGE("Softap already stopped"); 1795af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 1805af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 18184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (mSock < 0) { 182c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt LOGE("Softap stopap - failed to open socket"); 18384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 18484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 1859178b7390f9927aed57ae4a2da5b48991ed2aeeaDmitry Shmidt fnum = getPrivFuncNum(mIface, "AP_BSS_STOP"); 18684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (fnum < 0) { 187c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt LOGE("Softap stopap - function not supported"); 18884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 18984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 19084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt strncpy(wrq.ifr_name, mIface, sizeof(wrq.ifr_name)); 19184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.length = 0; 19284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.pointer = mBuf; 19384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.flags = 0; 19484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt ret = ioctl(mSock, fnum, &wrq); 1955af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#if 0 1965af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt LOGD("Stopping Softap service"); 1975af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt kill(mPid, SIGTERM); 1985af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt waitpid(mPid, NULL, 0); 1995af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt#endif 2005af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt mPid = 0; 20184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGD("Softap service stopped: %d", ret); 2023df450af1c2e35d854768a508b6905c6794f7a74Dmitry Shmidt usleep(AP_BSS_STOP_DELAY); 20384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return ret; 2045af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 2055af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 2065af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtbool SoftapController::isSoftapStarted() { 2075af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return (mPid != 0 ? true : false); 2085af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 2095af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 2107977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidtint SoftapController::addParam(int pos, const char *cmd, const char *arg) 2117977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt{ 2127977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (pos < 0) 2137977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt return pos; 2147977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if ((unsigned)(pos + strlen(cmd) + strlen(arg) + 1) >= sizeof(mBuf)) { 2157977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt LOGE("Command line is too big"); 2167977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt return -1; 2177977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 2187977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt pos += sprintf(&mBuf[pos], "%s=%s,", cmd, arg); 2197977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt return pos; 2207977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt} 2217977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt 22284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt/* 22384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt * Arguments: 22484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt * argv[2] - wlan interface 22584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt * argv[3] - softap interface 2267977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[4] - SSID 2277977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[5] - Security 2287977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[6] - Key 2297977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[7] - Channel 2307977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[8] - Preamble 2317977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt * argv[9] - Max SCB 23284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt */ 2335af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint SoftapController::setSoftap(int argc, char *argv[]) { 234a2d7e3e7d6e3f163f06e522378c6e2bd5cee28f8Kenny Root unsigned char psk[SHA256_DIGEST_LENGTH]; 235a2d7e3e7d6e3f163f06e522378c6e2bd5cee28f8Kenny Root char psk_str[2*SHA256_DIGEST_LENGTH+1]; 23684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt struct iwreq wrq; 2377977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt int fnum, ret, i = 0; 238321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt char *ssid; 23984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 24084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (mSock < 0) { 2417977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt LOGE("Softap set - failed to open socket"); 24284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 24384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 24484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (argc < 4) { 2457977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt LOGE("Softap set - missing arguments"); 24684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 24784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 24884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 2499178b7390f9927aed57ae4a2da5b48991ed2aeeaDmitry Shmidt fnum = getPrivFuncNum(argv[2], "AP_SET_CFG"); 25084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (fnum < 0) { 25184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("Softap set - function not supported"); 25284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return -1; 25384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 25484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 25584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt strncpy(mIface, argv[3], sizeof(mIface)); 25684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt strncpy(wrq.ifr_name, argv[2], sizeof(wrq.ifr_name)); 2577977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt 2587977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt /* Create command line */ 2597977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "ASCII_CMD", "AP_CFG"); 2607977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 4) { 261321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt ssid = argv[4]; 2627977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 263321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt ssid = (char *)"AndroidAP"; 2647977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 265321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt i = addParam(i, "SSID", ssid); 2667977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 5) { 2677977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "SEC", argv[5]); 2687977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 2697977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "SEC", "open"); 2707977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 2717977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 6) { 272321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt int j; 273a2d7e3e7d6e3f163f06e522378c6e2bd5cee28f8Kenny Root // Use the PKCS#5 PBKDF2 with 4096 iterations 274a2d7e3e7d6e3f163f06e522378c6e2bd5cee28f8Kenny Root PKCS5_PBKDF2_HMAC_SHA1(argv[6], strlen(argv[6]), 275a2d7e3e7d6e3f163f06e522378c6e2bd5cee28f8Kenny Root reinterpret_cast<const unsigned char *>(ssid), strlen(ssid), 276a2d7e3e7d6e3f163f06e522378c6e2bd5cee28f8Kenny Root 4096, SHA256_DIGEST_LENGTH, psk); 277a2d7e3e7d6e3f163f06e522378c6e2bd5cee28f8Kenny Root for (j=0; j < SHA256_DIGEST_LENGTH; j++) { 278321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt sprintf(&psk_str[j<<1], "%02x", psk[j]); 279321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt } 280321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt psk_str[j<<1] = '\0'; 281321f95a95cd41e0f58a72ca4f382d7e0a7f26d01Dmitry Shmidt i = addParam(i, "KEY", psk_str); 2827977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 2837977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "KEY", "12345678"); 2847977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 2857977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 7) { 2867977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "CHANNEL", argv[7]); 2877977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 2887977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "CHANNEL", "6"); 2897977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 2907977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 8) { 2917977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "PREAMBLE", argv[8]); 2927977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 2937977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "PREAMBLE", "0"); 2947977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 2957977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if (argc > 9) { 2967977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "MAX_SCB", argv[9]); 2977977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } else { 2987977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt i = addParam(i, "MAX_SCB", "8"); 2997977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt } 3007977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt if ((i < 0) || ((unsigned)(i + 4) >= sizeof(mBuf))) { 3017977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt LOGE("Softap set - command is too big"); 3027977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt return i; 30384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 3047977d67059ef94eefa9b14038df156b416fef877Dmitry Shmidt sprintf(&mBuf[i], "END"); 30584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt 30684c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.length = strlen(mBuf) + 1; 30784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.pointer = mBuf; 30884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt wrq.u.data.flags = 0; 30984c65a62fe7b053fed7f20274ca7379627a87b79Dmitry 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"); */ 31084c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt ret = ioctl(mSock, fnum, &wrq); 31184c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt if (ret) { 31284c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGE("Softap set - failed: %d", ret); 31384c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 31484c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt else { 31584c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt LOGD("Softap set - Ok"); 3163df450af1c2e35d854768a508b6905c6794f7a74Dmitry Shmidt usleep(AP_SET_CFG_DELAY); 31784c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt } 31884c65a62fe7b053fed7f20274ca7379627a87b79Dmitry Shmidt return ret; 3195af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 32031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt 32131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt/* 32231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt * Arguments: 32331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt * argv[2] - interface name 32431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt * argv[3] - AP or STA 32531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt */ 32631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidtint SoftapController::fwReloadSoftap(int argc, char *argv[]) 32731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt{ 32831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt struct iwreq wrq; 32931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt int fnum, ret, i = 0; 33031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt char *iface; 33131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt 33231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt if (mSock < 0) { 33331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt LOGE("Softap fwrealod - failed to open socket"); 33431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt return -1; 33531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 33631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt if (argc < 4) { 33731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt LOGE("Softap fwreload - missing arguments"); 33831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt return -1; 33931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 34031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt 34131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt iface = argv[2]; 34231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt fnum = getPrivFuncNum(iface, "WL_FW_RELOAD"); 34331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt if (fnum < 0) { 34431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt LOGE("Softap fwReload - function not supported"); 34531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt return -1; 34631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 34731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt 34831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt if (strcmp(argv[3], "AP") == 0) { 34931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt#ifdef WIFI_DRIVER_FW_AP_PATH 35031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt sprintf(mBuf, "FW_PATH=%s", WIFI_DRIVER_FW_AP_PATH); 35131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt#endif 35231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else { 35331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt#ifdef WIFI_DRIVER_FW_STA_PATH 35431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt sprintf(mBuf, "FW_PATH=%s", WIFI_DRIVER_FW_STA_PATH); 35531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt#endif 35631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 35731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt strncpy(wrq.ifr_name, iface, sizeof(wrq.ifr_name)); 35831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt wrq.u.data.length = strlen(mBuf) + 1; 35931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt wrq.u.data.pointer = mBuf; 36031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt wrq.u.data.flags = 0; 36131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt ret = ioctl(mSock, fnum, &wrq); 36231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt if (ret) { 36331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt LOGE("Softap fwReload - failed: %d", ret); 36431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 36531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt else { 36631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt LOGD("Softap fwReload - Ok"); 36731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } 36831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt return ret; 36931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt} 370