/* * Arguments: * argv[2] - wlan interface * argv[3] - SSID * argv[4] - Broadcast/Hidden * argv[5] - Channel * argv[6] - Security * argv[7] - Key */ int SoftapController::setSoftap(int argc, char *argv[]) { char psk_str[2*SHA256_DIGEST_LENGTH+1]; int ret = ResponseCode::SoftapStatusResult; int i = 0; int fd; int hidden = 0; int channel = AP_CHANNEL_DEFAULT; char *wbuf = NULL; char *fbuf = NULL; #ifdef USE_MTK_WLAN char ap_channel[PROPERTY_VALUE_MAX] = {'\0'}; const char AP_CHANNEL_PROP_NAME[]="wifi.tethering.channel"; #endif if (argc < 5) { ALOGE("Softap set is missing arguments. Please use:"); ALOGE("softap <wlan iface> <SSID> <hidden/broadcast> <channel> <wpa2?-psk|open> <passphrase>"); return ResponseCode::CommandSyntaxError; } if (!strcasecmp(argv[4], "hidden")) hidden = 1; if (argc >= 5) { #ifndef USE_MTK_WLAN channel = atoi(argv[5]); #else if (property_get(AP_CHANNEL_PROP_NAME, ap_channel, NULL)) { channel = atoi(ap_channel); } else { channel = AP_CHANNEL_DEFAULT; } #endif if (channel <= 0) channel = AP_CHANNEL_DEFAULT; } #ifndef USE_MTK_WLAN asprintf(&wbuf, "interface=%s\ndriver=nl80211\nctrl_interface=" "/data/misc/wifi/hostapd\nssid=%s\nchannel=%d\nieee80211n=1\n" "hw_mode=g\nignore_broadcast_ssid=%d\n", argv[2], argv[3], channel, hidden); #else /* * Arguments: * argv[2] - wlan interface * argv[3] - SSID * argv[4] - Broadcast/Hidden * argv[5] - Channel * argv[6] - Security * argv[7] - Key * argv[8] - Channel width * argv[9] - Max connection * argv[10] - Suspend */ asprintf(&wbuf, "interface=%s\ndriver=nl80211\nctrl_interface=" "/data/misc/wifi/hostapd\nssid=%s\nchannel=%d\nieee80211n=1\n" "hw_mode=g\nignore_broadcast_ssid=%d\nmax_num_sta=%d\n" "eap_server=1\nwps_state=2\nconfig_methods=display physical_display push_button\n" "device_name=AndroidAP\nmanufacturer=MediaTek Inc.\nmodel_name=MTK Wireless Model\n" "model_number=66xx\nserial_number=1.0\ndevice_type=10-0050F204-5\n", "ap0", argv[3], channel, hidden, atoi(argv[9])); #endif if (argc > 7) { if (!strcmp(argv[6], "wpa-psk")) { generatePsk(argv[3], argv[7], psk_str); asprintf(&fbuf, "%swpa=1\nwpa_pairwise=TKIP CCMP\nwpa_psk=%s\n", wbuf, psk_str); } else if (!strcmp(argv[6], "wpa2-psk")) { generatePsk(argv[3], argv[7], psk_str); asprintf(&fbuf, "%swpa=2\nrsn_pairwise=CCMP\nwpa_psk=%s\n", wbuf, psk_str); } else if (!strcmp(argv[6], "open")) { asprintf(&fbuf, "%s", wbuf); } } else if (argc > 6) { if (!strcmp(argv[6], "open")) { asprintf(&fbuf, "%s", wbuf); } } else { asprintf(&fbuf, "%s", wbuf); } ALOGD("setSoftap as:\n%s\n", fbuf); fd = open(HOSTAPD_CONF_FILE, O_CREAT | O_TRUNC | O_WRONLY | O_NOFOLLOW, 0660); if (fd < 0) { ALOGE("Cannot update \"%s\": %s", HOSTAPD_CONF_FILE, strerror(errno)); free(wbuf); free(fbuf); return ResponseCode::OperationFailed; } if (write(fd, fbuf, strlen(fbuf)) < 0) { ALOGE("Cannot write to \"%s\": %s", HOSTAPD_CONF_FILE, strerror(errno)); ret = ResponseCode::OperationFailed; } free(wbuf); free(fbuf); /* Note: apparently open can fail to set permissions correctly at times */ if (fchmod(fd, 0660) < 0) { ALOGE("Error changing permissions of %s to 0660: %s", HOSTAPD_CONF_FILE, strerror(errno)); close(fd); unlink(HOSTAPD_CONF_FILE); return ResponseCode::OperationFailed; } if (fchown(fd, AID_SYSTEM, AID_WIFI) < 0) { ALOGE("Error changing group ownership of %s to %d: %s", HOSTAPD_CONF_FILE, AID_WIFI, strerror(errno)); close(fd); unlink(HOSTAPD_CONF_FILE); return ResponseCode::OperationFailed; } close(fd); return ret; }
/* * Arguments: * argv[2] - wlan interface * argv[3] - softap interface * argv[4] - SSID * argv[5] - Security * argv[6] - Key * argv[7] - Channel * argv[8] - Preamble * argv[9] - Max SCB */ int SoftapController::setSoftap(int argc, char *argv[]) { char psk_str[2*SHA256_DIGEST_LENGTH+1]; int ret = 0, i = 0, fd; char *ssid, *iface; if (mSock < 0) { LOGE("Softap set - failed to open socket"); return -1; } if (argc < 4) { LOGE("Softap set - missing arguments"); return -1; } strncpy(mIface, argv[3], sizeof(mIface)); iface = argv[2]; #ifdef HAVE_HOSTAPD char *wbuf = NULL; char *fbuf = NULL; if (argc > 4) { ssid = argv[4]; } else { ssid = (char *)"AndroidAP"; } asprintf(&wbuf, "interface=%s\ndriver=nl80211\nctrl_interface=" "/data/misc/wifi/hostapd\nssid=%s\nchannel=6\n", iface, ssid); if (argc > 5) { if (!strcmp(argv[5], "wpa-psk")) { generatePsk(ssid, argv[6], psk_str); asprintf(&fbuf, "%swpa=1\nwpa_pairwise=TKIP CCMP\nwpa_psk=%s\n", wbuf, psk_str); } else if (!strcmp(argv[5], "wpa2-psk")) { generatePsk(ssid, argv[6], psk_str); asprintf(&fbuf, "%swpa=2\nrsn_pairwise=CCMP\nwpa_psk=%s\n", wbuf, psk_str); } else if (!strcmp(argv[5], "open")) { asprintf(&fbuf, "%s", wbuf); } } else { asprintf(&fbuf, "%s", wbuf); } fd = open(HOSTAPD_CONF_FILE, O_CREAT | O_TRUNC | O_WRONLY, 0660); if (fd < 0) { LOGE("Cannot update \"%s\": %s", HOSTAPD_CONF_FILE, strerror(errno)); free(wbuf); free(fbuf); return -1; } if (write(fd, fbuf, strlen(fbuf)) < 0) { LOGE("Cannot write to \"%s\": %s", HOSTAPD_CONF_FILE, strerror(errno)); ret = -1; } close(fd); free(wbuf); free(fbuf); /* Note: apparently open can fail to set permissions correctly at times */ if (chmod(HOSTAPD_CONF_FILE, 0660) < 0) { LOGE("Error changing permissions of %s to 0660: %s", HOSTAPD_CONF_FILE, strerror(errno)); unlink(HOSTAPD_CONF_FILE); return -1; } if (chown(HOSTAPD_CONF_FILE, AID_SYSTEM, AID_WIFI) < 0) { LOGE("Error changing group ownership of %s to %d: %s", HOSTAPD_CONF_FILE, AID_WIFI, strerror(errno)); unlink(HOSTAPD_CONF_FILE); return -1; } #else /* Create command line */ i = addParam(i, "ASCII_CMD", "AP_CFG"); if (argc > 4) { ssid = argv[4]; } else { ssid = (char *)"AndroidAP"; } i = addParam(i, "SSID", ssid); if (argc > 5) { i = addParam(i, "SEC", argv[5]); } else { i = addParam(i, "SEC", "open"); } if (argc > 6) { generatePsk(ssid, argv[6], psk_str); i = addParam(i, "KEY", psk_str); } else { i = addParam(i, "KEY", "12345678"); } if (argc > 7) { i = addParam(i, "CHANNEL", argv[7]); } else { i = addParam(i, "CHANNEL", "6"); } if (argc > 8) { i = addParam(i, "PREAMBLE", argv[8]); } else { i = addParam(i, "PREAMBLE", "0"); } if (argc > 9) { i = addParam(i, "MAX_SCB", argv[9]); } else { i = addParam(i, "MAX_SCB", "8"); } if ((i < 0) || ((unsigned)(i + 4) >= sizeof(mBuf))) { LOGE("Softap set - command is too big"); return i; } sprintf(&mBuf[i], "END"); /* system("iwpriv eth0 WL_AP_CFG ASCII_CMD=AP_CFG,SSID=\"AndroidAP\",SEC=\"open\",KEY=12345,CHANNEL=1,PREAMBLE=0,MAX_SCB=8,END"); */ ret = setCommand(iface, "AP_SET_CFG"); if (ret) { LOGE("Softap set - failed: %d", ret); } else { LOGD("Softap set - Ok"); usleep(AP_SET_CFG_DELAY); } #endif return ret; }
/* * Arguments: * argv[2] - wlan interface * argv[3] - SSID * argv[4] - Broadcast/Hidden * argv[5] - Channel * argv[6] - Security * argv[7] - Key */ int SoftapController::setSoftap(int argc, char *argv[]) { char psk_str[2*SHA256_DIGEST_LENGTH+1]; int ret = ResponseCode::SoftapStatusResult; int fd; int hidden = 0; int channel = AP_CHANNEL_DEFAULT; char *wbuf = NULL; char *fbuf = NULL; if (argc < 5) { ALOGE("Softap set is missing arguments. Please use:"); ALOGE("softap <wlan iface> <SSID> <hidden/broadcast> <channel> <wpa2?-psk|open> <passphrase>"); return ResponseCode::CommandSyntaxError; } if (!strcasecmp(argv[4], "hidden")) hidden = 1; if (argc >= 5) { channel = atoi(argv[5]); if (channel <= 0) channel = AP_CHANNEL_DEFAULT; } asprintf(&wbuf, "interface=%s\ndriver=nl80211\nctrl_interface=" "/data/misc/wifi/hostapd\nssid=%s\nchannel=%d\nieee80211n=1\n" "hw_mode=g\nignore_broadcast_ssid=%d\nwowlan_triggers=any\n", argv[2], argv[3], channel, hidden); if (argc > 7) { if (!strcmp(argv[6], "wpa-psk")) { generatePsk(argv[3], argv[7], psk_str); asprintf(&fbuf, "%swpa=3\nwpa_pairwise=TKIP CCMP\nwpa_psk=%s\n", wbuf, psk_str); } else if (!strcmp(argv[6], "wpa2-psk")) { generatePsk(argv[3], argv[7], psk_str); asprintf(&fbuf, "%swpa=2\nrsn_pairwise=CCMP\nwpa_psk=%s\n", wbuf, psk_str); } else if (!strcmp(argv[6], "open")) { asprintf(&fbuf, "%s", wbuf); } } else if (argc > 6) { if (!strcmp(argv[6], "open")) { asprintf(&fbuf, "%s", wbuf); } } else { asprintf(&fbuf, "%s", wbuf); } fd = open(HOSTAPD_CONF_FILE, O_CREAT | O_TRUNC | O_WRONLY | O_NOFOLLOW, 0660); if (fd < 0) { ALOGE("Cannot update \"%s\": %s", HOSTAPD_CONF_FILE, strerror(errno)); free(wbuf); free(fbuf); return ResponseCode::OperationFailed; } if (write(fd, fbuf, strlen(fbuf)) < 0) { ALOGE("Cannot write to \"%s\": %s", HOSTAPD_CONF_FILE, strerror(errno)); ret = ResponseCode::OperationFailed; } free(wbuf); free(fbuf); /* Note: apparently open can fail to set permissions correctly at times */ if (fchmod(fd, 0660) < 0) { ALOGE("Error changing permissions of %s to 0660: %s", HOSTAPD_CONF_FILE, strerror(errno)); close(fd); unlink(HOSTAPD_CONF_FILE); return ResponseCode::OperationFailed; } if (fchown(fd, AID_SYSTEM, AID_WIFI) < 0) { ALOGE("Error changing group ownership of %s to %d: %s", HOSTAPD_CONF_FILE, AID_WIFI, strerror(errno)); close(fd); unlink(HOSTAPD_CONF_FILE); return ResponseCode::OperationFailed; } close(fd); return ret; }
/* * Arguments: * argv[2] - wlan interface * argv[3] - softap interface * argv[4] - SSID * argv[5] - Broadcast/Hidden * argv[6] - Channel * argv[7] - Security * argv[8] - Key * the following argv may missing * argv[9] - Preamble * argv[10] - Max SCB */ int SoftapController::setSoftap(int argc, char *argv[]) { char psk_str[2*SHA256_DIGEST_LENGTH+1]; int ret = ResponseCode::SoftapStatusResult; int i = 0; char *ssid, *iface; int fd; int hidden = 0; int channel = AP_CHANNEL_DEFAULT; char *wbuf = NULL; char *fbuf = NULL; if (mSock < 0) { ALOGE("Softap set - failed to open socket"); return ResponseCode::OperationFailed; } if (argc < 5) { ALOGE("Softap set is missing arguments. Please use:"); ALOGE("softap <wlan iface> <SSID> <hidden/broadcast> <channel> <wpa2?-psk|open> <passphrase>"); return ResponseCode::CommandSyntaxError; } strncpy(mIface, argv[3], sizeof(mIface)); iface = argv[2]; #ifdef HAVE_HOSTAPD if (!strcasecmp(argv[5], "hidden")) hidden = 1; if (argc > 4) { ssid = argv[4]; } else { ssid = (char *)"AndroidAP"; } if (argc >= 5) { channel = atoi(argv[5]); if (channel <= 0) channel = AP_CHANNEL_DEFAULT; } asprintf(&wbuf, "interface=%s\ndriver=" HOSTAPD_DRIVER_NAME "\nctrl_interface=" "/data/misc/wifi/hostapd\nssid=%s\nchannel=%d\nieee80211n=1\n" "hw_mode=g\nignore_broadcast_ssid=%d\n", iface, ssid, channel, hidden); if (argc > 7) { if (!strcmp(argv[7], "wpa-psk")) { generatePsk(ssid, argv[8], psk_str); asprintf(&fbuf, "%swpa=1\nwpa_pairwise=TKIP CCMP\nwpa_psk=%s\n", wbuf, psk_str); } else if (!strcmp(argv[7], "wpa2-psk")) { generatePsk(ssid, argv[8], psk_str); asprintf(&fbuf, "%swpa=2\nrsn_pairwise=CCMP\nwpa_psk=%s\n", wbuf, psk_str); } else if (!strcmp(argv[7], "open")) { asprintf(&fbuf, "%s", wbuf); } } else if (argc > 6) { if (!strcmp(argv[6], "open")) { asprintf(&fbuf, "%s", wbuf); } } else { asprintf(&fbuf, "%s", wbuf); } fd = open(HOSTAPD_CONF_FILE, O_CREAT | O_TRUNC | O_WRONLY | O_NOFOLLOW, 0660); if (fd < 0) { ALOGE("Cannot update \"%s\": %s", HOSTAPD_CONF_FILE, strerror(errno)); free(wbuf); free(fbuf); return ResponseCode::OperationFailed; } if (write(fd, fbuf, strlen(fbuf)) < 0) { ALOGE("Cannot write to \"%s\": %s", HOSTAPD_CONF_FILE, strerror(errno)); ret = ResponseCode::OperationFailed; } free(wbuf); free(fbuf); /* Note: apparently open can fail to set permissions correctly at times */ if (fchmod(fd, 0660) < 0) { ALOGE("Error changing permissions of %s to 0660: %s", HOSTAPD_CONF_FILE, strerror(errno)); close(fd); unlink(HOSTAPD_CONF_FILE); return ResponseCode::OperationFailed; } if (fchown(fd, AID_SYSTEM, AID_WIFI) < 0) { ALOGE("Error changing group ownership of %s to %d: %s", HOSTAPD_CONF_FILE, AID_WIFI, strerror(errno)); close(fd); unlink(HOSTAPD_CONF_FILE); return ResponseCode::OperationFailed; } close(fd); #else /* Create command line */ i = addParam(i, "ASCII_CMD", "AP_CFG"); if (argc > 4) { ssid = argv[4]; } else { ssid = (char *)"AndroidAP"; } i = addParam(i, "SSID", ssid); if (argc > 7) { i = addParam(i, "SEC", argv[7]); } else { i = addParam(i, "SEC", "open"); } if (argc > 8) { generatePsk(ssid, argv[8], psk_str); i = addParam(i, "KEY", psk_str); } else { i = addParam(i, "KEY", "12345678"); } if (argc > 6) { i = addParam(i, "CHANNEL", argv[6]); } else { i = addParam(i, "CHANNEL", "6"); } if (argc > 9) { i = addParam(i, "PREAMBLE", argv[9]); } else { i = addParam(i, "PREAMBLE", "0"); } if (argc > 10) { i = addParam(i, "MAX_SCB", argv[10]); } else { i = addParam(i, "MAX_SCB", "8"); } if ((i < 0) || ((unsigned)(i + 4) >= sizeof(mBuf))) { ALOGE("Softap set - command is too big"); return ResponseCode::OperationFailed; } sprintf(&mBuf[i], "END"); /* system("iwpriv eth0 WL_AP_CFG ASCII_CMD=AP_CFG,SSID=\"AndroidAP\",SEC=\"open\",KEY=12345,CHANNEL=1,PREAMBLE=0,MAX_SCB=8,END"); */ ret = setCommand(iface, "AP_SET_CFG"); if (ret) { ALOGE("Softap set - failed: %d", ret); ret = ResponseCode::ServiceStartFailed; } else { ALOGD("Softap set - Ok"); usleep(AP_SET_CFG_DELAY); } #endif return ret; }