system/qcom: Turn off SAP when operating on a LTE interfering channel.

Turn off and restart sap with safe channel list received from android
telephony layer, whenever sap is operating on an channel interfering with
LTE.

Change-Id: Iefec6024a63c820e09b837b7daa7ba5a486ac1d2
This commit is contained in:
Deepthi Gowri
2012-05-23 23:28:16 +05:30
parent 9f0d356f58
commit 684d2f9514
2 changed files with 108 additions and 1 deletions

View File

@@ -46,10 +46,13 @@
#include "qsap_api.h"
#include "qsap.h"
#define WLAN_PRIV_SET_THREE_INT_GET_NONE (SIOCIWFIRSTPRIV + 4)
#define QCSAP_IOCTL_GET_CHANNEL (SIOCIWFIRSTPRIV+9)
#define QCSAP_IOCTL_ASSOC_STA_MACADDR (SIOCIWFIRSTPRIV+10)
#define QCSAP_IOCTL_DISASSOC_STA (SIOCIWFIRSTPRIV+11)
#define QCSAP_IOCTL_AP_STATS (SIOCIWFIRSTPRIV+12)
#define QCSAP_IOCTL_SET_CHANNEL_RANGE (SIOCIWFIRSTPRIV+17)
#define WE_SET_SAP_CHANNELS 3
//#define LOG_TAG "QCSDK-"
@@ -142,6 +145,7 @@ static struct Command cmd_list[eCMD_LAST] = {
{ "basic_rates", NULL },
{ "require_ht", NULL },
{ "ieee80211n", "1" },
{ "setchannelrange", NULL },
};
struct Command qsap_str[eSTR_LAST] = {
@@ -1152,6 +1156,85 @@ error:
return eERR_CHAN_READ;
}
/**
* Set the channel Range for soft AP.
*/
int qsap_set_channel_range(s8 *buf)
{
int sock;
struct iwreq wrq;
s8 interface[MAX_CONF_LINE_LEN];
u32 len = MAX_CONF_LINE_LEN;
s8 *pif;
s8 *temp;
int ret, i;
sap_channel_info sap_chan_range;
sta_channel_info sta_chan_range;
LOGE("buf :%s\n", buf);
temp = buf;
temp = strchr(buf, '=');
if (NULL == temp) {
goto error;
}
temp++;
if (NULL == (pif = qsap_get_config_value(pconffile,
&qsap_str[STR_INTERFACE], interface, &len))) {
LOGE("%s :interface error\n", __func__);
goto error;
}
interface[len] = '\0';
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
LOGE("%s :socket error\n", __func__);
goto error;
}
memset(&sap_chan_range, 0, sizeof(sap_chan_range));
memset(&sta_chan_range, 0, sizeof(sta_chan_range));
memset(&wrq, 0, sizeof(wrq));
if (ENABLE != is_softap_enabled()) {
strncpy(wrq.ifr_name, "wlan0", sizeof(wrq.ifr_name));
sta_chan_range.subioctl = WE_SET_SAP_CHANNELS;
sscanf(temp, "%d %d %d", &(sta_chan_range.stastartchan),
&(sta_chan_range.staendchan), &(sta_chan_range.staband));
memcpy(wrq.u.name, (char *)(&sta_chan_range), sizeof(sta_chan_range));
LOGE("%s :Softap is off,Send SET_CHANNEL_RANGE over sta interface\n",
__func__);
ret = ioctl(sock, WLAN_PRIV_SET_THREE_INT_GET_NONE, &wrq);
} else {
strncpy(wrq.ifr_name, pif, sizeof(wrq.ifr_name));
sscanf(temp, "%d %d %d", &(sap_chan_range.startchan),
&(sap_chan_range.endchan), &(sap_chan_range.band));
memcpy(wrq.u.name, (char *)(&sap_chan_range), sizeof(sap_chan_range));
LOGE("%s :SAP is on,Send SET_CHANNEL_RANGE over softap interface\n",
__func__);
ret = ioctl(sock, QCSAP_IOCTL_SET_CHANNEL_RANGE, &wrq);
}
if (ret < 0) {
LOGE("%s: ioctl failure\n", __func__);
close(sock);
goto error;
}
LOGE("Recv len :%d\n", wrq.u.data.length);
close(sock);
return eSUCCESS;
error:
LOGE("%s: Failed to set channel range\n", __func__);
return eERR_SET_CHAN_RANGE;
}
int qsap_read_channel(s8 *pfile, struct Command *pcmd, s8 *presp, u32 *plen, s8 *pvar)
{
s8 *pval;
@@ -2734,6 +2817,12 @@ static void qsap_handle_set_request(s8 *pcmd, s8 *presp, u32 *plen)
cNum = STR_AP_ENERGY_DETECT_TH;
ini = INI_CONF_FILE;
break;
case eCMD_SET_CHANNEL_RANGE:
LOGE("eCMD_SET_CHANNEL_RANGE pcmd :%s\n", pcmd);
value = qsap_set_channel_range(pcmd);
*plen = snprintf(presp, *plen, "%s", (value == eSUCCESS) ? SUCCESS :
ERR_UNKNOWN);
return;
default: ;
/** Do not goto error, in default case */