system/qcom: Implement ndc for SAP get auto channel.
Implement ndc for get auto channel and get operating channel for SAP. CRs-fixed: 368536 Change-Id: Ie9b760012eafd65686e9ab05b1086c2fe928a5ca
This commit is contained in:
@@ -46,12 +46,14 @@
|
|||||||
#include "qsap_api.h"
|
#include "qsap_api.h"
|
||||||
#include "qsap.h"
|
#include "qsap.h"
|
||||||
|
|
||||||
|
#define QCSAP_IOCTL_GETPARAM (SIOCIWFIRSTPRIV+1)
|
||||||
#define WLAN_PRIV_SET_THREE_INT_GET_NONE (SIOCIWFIRSTPRIV + 4)
|
#define WLAN_PRIV_SET_THREE_INT_GET_NONE (SIOCIWFIRSTPRIV + 4)
|
||||||
#define QCSAP_IOCTL_GET_CHANNEL (SIOCIWFIRSTPRIV+9)
|
#define QCSAP_IOCTL_GET_CHANNEL (SIOCIWFIRSTPRIV+9)
|
||||||
#define QCSAP_IOCTL_ASSOC_STA_MACADDR (SIOCIWFIRSTPRIV+10)
|
#define QCSAP_IOCTL_ASSOC_STA_MACADDR (SIOCIWFIRSTPRIV+10)
|
||||||
#define QCSAP_IOCTL_DISASSOC_STA (SIOCIWFIRSTPRIV+11)
|
#define QCSAP_IOCTL_DISASSOC_STA (SIOCIWFIRSTPRIV+11)
|
||||||
#define QCSAP_IOCTL_AP_STATS (SIOCIWFIRSTPRIV+12)
|
#define QCSAP_IOCTL_AP_STATS (SIOCIWFIRSTPRIV+12)
|
||||||
#define QCSAP_IOCTL_SET_CHANNEL_RANGE (SIOCIWFIRSTPRIV+17)
|
#define QCSAP_IOCTL_SET_CHANNEL_RANGE (SIOCIWFIRSTPRIV+17)
|
||||||
|
#define QCSAP_PARAM_GET_AUTO_CHANNEL 9
|
||||||
#define WE_SET_SAP_CHANNELS 3
|
#define WE_SET_SAP_CHANNELS 3
|
||||||
|
|
||||||
//#define LOG_TAG "QCSDK-"
|
//#define LOG_TAG "QCSDK-"
|
||||||
@@ -146,6 +148,7 @@ static struct Command cmd_list[eCMD_LAST] = {
|
|||||||
{ "require_ht", NULL },
|
{ "require_ht", NULL },
|
||||||
{ "ieee80211n", "1" },
|
{ "ieee80211n", "1" },
|
||||||
{ "setchannelrange", NULL },
|
{ "setchannelrange", NULL },
|
||||||
|
{ "autochannel", NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Command qsap_str[eSTR_LAST] = {
|
struct Command qsap_str[eSTR_LAST] = {
|
||||||
@@ -1145,7 +1148,7 @@ int qsap_get_operating_channel(s32 *pchan)
|
|||||||
}
|
}
|
||||||
|
|
||||||
LOGE("Recv len :%d \n", wrq.u.data.length);
|
LOGE("Recv len :%d \n", wrq.u.data.length);
|
||||||
|
*pchan = *(int *)(&wrq.u.name[0]);
|
||||||
LOGE("Operating channel :%ld \n", *pchan);
|
LOGE("Operating channel :%ld \n", *pchan);
|
||||||
close(sock);
|
close(sock);
|
||||||
return eSUCCESS;
|
return eSUCCESS;
|
||||||
@@ -1156,6 +1159,70 @@ error:
|
|||||||
return eERR_CHAN_READ;
|
return eERR_CHAN_READ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the sap auto channel selection for soft AP.
|
||||||
|
*/
|
||||||
|
int qsap_get_sap_auto_channel_selection(s32 *pautochan)
|
||||||
|
{
|
||||||
|
int sock;
|
||||||
|
struct iwreq wrq;
|
||||||
|
s8 interface[MAX_CONF_LINE_LEN];
|
||||||
|
u32 len = MAX_CONF_LINE_LEN;
|
||||||
|
s8 *pif;
|
||||||
|
int ret;
|
||||||
|
sap_auto_channel_info sap_autochan_info;
|
||||||
|
s32 *pchan;
|
||||||
|
|
||||||
|
if(ENABLE != is_softap_enabled()) {
|
||||||
|
LOGE("%s :is_softap_enabled() goto error \n", __func__);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(NULL == (pif = qsap_get_config_value(pconffile,
|
||||||
|
&qsap_str[STR_INTERFACE], interface, &len))) {
|
||||||
|
LOGD("%s :interface error \n", __func__);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface[len] = '\0';
|
||||||
|
|
||||||
|
sock = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
if(sock < 0) {
|
||||||
|
LOGD("%s :socket error \n", __func__);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pautochan = 0;
|
||||||
|
|
||||||
|
memset(&sap_autochan_info, 0, sizeof(sap_autochan_info));
|
||||||
|
memset(&wrq, 0, sizeof(wrq));
|
||||||
|
|
||||||
|
strncpy(wrq.ifr_name, pif, sizeof(wrq.ifr_name));
|
||||||
|
wrq.u.data.length = sizeof(s32);
|
||||||
|
sap_autochan_info.subioctl = QCSAP_PARAM_GET_AUTO_CHANNEL;
|
||||||
|
wrq.u.data.pointer = pautochan;
|
||||||
|
memcpy(wrq.u.name, (char *)(&sap_autochan_info), sizeof(sap_autochan_info));
|
||||||
|
wrq.u.data.flags = 0;
|
||||||
|
|
||||||
|
ret = ioctl(sock, QCSAP_IOCTL_GETPARAM, &wrq);
|
||||||
|
if(ret < 0) {
|
||||||
|
LOGE("%s: ioctl failure \n",__func__);
|
||||||
|
close(sock);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOGD("Recv len :%d \n", wrq.u.data.length);
|
||||||
|
*pautochan = *(int *)(&wrq.u.name[0]);
|
||||||
|
LOGD("Sap auto channel selection pautochan=%ld \n", *pautochan);
|
||||||
|
close(sock);
|
||||||
|
return eSUCCESS;
|
||||||
|
|
||||||
|
error:
|
||||||
|
*pautochan = 0;
|
||||||
|
LOGE("%s: Failed to read sap auto channel selection\n", __func__);
|
||||||
|
return eERR_GET_AUTO_CHAN;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the channel Range for soft AP.
|
* Set the channel Range for soft AP.
|
||||||
*/
|
*/
|
||||||
@@ -1241,26 +1308,32 @@ int qsap_read_channel(s8 *pfile, struct Command *pcmd, s8 *presp, u32 *plen, s8
|
|||||||
s32 chan;
|
s32 chan;
|
||||||
u32 len = *plen;
|
u32 len = *plen;
|
||||||
|
|
||||||
if(eSUCCESS == qsap_read_cfg(pfile, pcmd, presp, plen, pvar, GET_ENABLED_ONLY)) {
|
if(eSUCCESS == qsap_get_operating_channel(&chan)) {
|
||||||
pval = strchr(presp, '=');
|
*plen = snprintf(presp, len, "%s %s=%lu", SUCCESS, pcmd->name, chan);
|
||||||
|
LOGD("presp :%s\n", presp);
|
||||||
|
} else {
|
||||||
|
*plen = snprintf(presp, len, "%s", ERR_UNKNOWN);
|
||||||
|
}
|
||||||
|
|
||||||
if(NULL == pval) {
|
return eSUCCESS;
|
||||||
LOGE("%s :CHAN absent \n", __func__);
|
}
|
||||||
return eERR_CONFIG_PARAM_MISSING;
|
|
||||||
}
|
|
||||||
|
|
||||||
pval++;
|
int qsap_read_auto_channel(struct Command *pcmd, s8 *presp, u32 *plen)
|
||||||
chan = atoi(pval);
|
{
|
||||||
|
s8 *pval, *pautoval;
|
||||||
|
s32 pautochan;
|
||||||
|
u32 len = *plen;
|
||||||
|
int autochan;
|
||||||
|
|
||||||
if(chan == AUTO_CHANNEL) {
|
LOGE("%s :\n", __func__);
|
||||||
if(eSUCCESS == qsap_get_operating_channel(&chan)) {
|
|
||||||
*plen = snprintf(presp, len, "%s %s=0,%lu", SUCCESS, pcmd->name, chan);
|
if (eSUCCESS == qsap_get_sap_auto_channel_selection(&pautochan)) {
|
||||||
}
|
*plen = snprintf(presp, len, "%s autochannel=%lu", SUCCESS, pautochan);
|
||||||
else {
|
LOGE("presp :%s\n", presp);
|
||||||
*plen = snprintf(presp, len, "%s", ERR_UNKNOWN);
|
} else {
|
||||||
}
|
*plen = snprintf(presp, len, "%s", ERR_UNKNOWN);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return eSUCCESS;
|
return eSUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1613,7 +1686,9 @@ static void qsap_get_from_config(esap_cmd_t cNum, s8 *presp, u32 *plen)
|
|||||||
case eCMD_AP_ENERGY_DETECT_TH:
|
case eCMD_AP_ENERGY_DETECT_TH:
|
||||||
qsap_read_cfg(fIni, &qsap_str[STR_AP_ENERGY_DETECT_TH], presp, plen, cmd_list[eCMD_AP_ENERGY_DETECT_TH].name, GET_ENABLED_ONLY);
|
qsap_read_cfg(fIni, &qsap_str[STR_AP_ENERGY_DETECT_TH], presp, plen, cmd_list[eCMD_AP_ENERGY_DETECT_TH].name, GET_ENABLED_ONLY);
|
||||||
break;
|
break;
|
||||||
|
case eCMD_GET_AUTO_CHANNEL:
|
||||||
|
qsap_read_auto_channel(&cmd_list[cNum],presp, plen);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/** Error case */
|
/** Error case */
|
||||||
*plen = snprintf(presp, *plen, "%s", ERR_INVALID_ARG);
|
*plen = snprintf(presp, *plen, "%s", ERR_INVALID_ARG);
|
||||||
|
|||||||
@@ -76,7 +76,8 @@ enum error_val {
|
|||||||
eERR_UNLOAD_FAILED_SOFTAP,
|
eERR_UNLOAD_FAILED_SOFTAP,
|
||||||
eERR_LOAD_FAILED_SDIOIF,
|
eERR_LOAD_FAILED_SDIOIF,
|
||||||
eERR_LOAD_FAILED_SOFTAP,
|
eERR_LOAD_FAILED_SOFTAP,
|
||||||
eERR_SET_CHAN_RANGE
|
eERR_SET_CHAN_RANGE,
|
||||||
|
eERR_GET_AUTO_CHAN
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef WIFI_DRIVER_CONF_FILE
|
#ifndef WIFI_DRIVER_CONF_FILE
|
||||||
@@ -314,6 +315,7 @@ typedef enum esap_cmd {
|
|||||||
eCMD_REQUIRE_HT = 60,
|
eCMD_REQUIRE_HT = 60,
|
||||||
eCMD_IEEE80211N = 61,
|
eCMD_IEEE80211N = 61,
|
||||||
eCMD_SET_CHANNEL_RANGE = 62,
|
eCMD_SET_CHANNEL_RANGE = 62,
|
||||||
|
eCMD_GET_AUTO_CHANNEL = 63,
|
||||||
|
|
||||||
eCMD_LAST /** New command numbers should be added above this */
|
eCMD_LAST /** New command numbers should be added above this */
|
||||||
} esap_cmd_t;
|
} esap_cmd_t;
|
||||||
@@ -454,6 +456,11 @@ typedef struct sap_channel_info {
|
|||||||
int band;
|
int band;
|
||||||
} sap_channel_info;
|
} sap_channel_info;
|
||||||
|
|
||||||
|
/**SAP auto Channel information*/
|
||||||
|
typedef struct sap_auto_channel_info {
|
||||||
|
int subioctl;
|
||||||
|
} sap_auto_channel_info;
|
||||||
|
|
||||||
/** Validate enable / disable softap */
|
/** Validate enable / disable softap */
|
||||||
#define IS_VALID_SOFTAP_ENABLE(x) (((value == ENABLE) || (value == DISABLE)) ? TRUE: FALSE)
|
#define IS_VALID_SOFTAP_ENABLE(x) (((value == ENABLE) || (value == DISABLE)) ? TRUE: FALSE)
|
||||||
|
|
||||||
@@ -569,6 +576,7 @@ s16 wifi_qsap_reset_to_default(s8 *pcfgfile, s8 *pdefault);
|
|||||||
void check_for_configuration_files(void);
|
void check_for_configuration_files(void);
|
||||||
void qsap_set_ini_filename(void);
|
void qsap_set_ini_filename(void);
|
||||||
int qsap_set_channel_range(s8 * cmd);
|
int qsap_set_channel_range(s8 * cmd);
|
||||||
|
int qsap_get_sap_auto_channel_slection(s32 *pautochan);
|
||||||
|
|
||||||
#if __cplusplus
|
#if __cplusplus
|
||||||
}; // extern "C"
|
}; // extern "C"
|
||||||
|
|||||||
Reference in New Issue
Block a user