aboutsummaryrefslogtreecommitdiffstats
path: root/src/drivers
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2011-09-27 12:29:26 -0700
committerArik Nemtsov <arik@wizery.com>2012-08-02 13:03:59 +0300
commit7b677953285ac02bab8ca9f8caf4a9d6555c0195 (patch)
tree1f50ec89301aa0773f6d36c7b933698a53ddd793 /src/drivers
parent7a5ce07f3f99f8450c0364b1b2c69b4096f200a9 (diff)
downloadexternal_wpa_supplicant_8_ti-7b677953285ac02bab8ca9f8caf4a9d6555c0195.zip
external_wpa_supplicant_8_ti-7b677953285ac02bab8ca9f8caf4a9d6555c0195.tar.gz
external_wpa_supplicant_8_ti-7b677953285ac02bab8ca9f8caf4a9d6555c0195.tar.bz2
nl80211: Add set_noa, set_p2p_powersave, set_ap_wps_ie
Fix WFD and WPS certification problem for GO (BRCM) Change-Id: I5bbac818aad7c0a14fddb3beb88a6a2d87c07ea0 Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/android_drv.h2
-rw-r--r--src/drivers/driver_nl80211.c79
2 files changed, 81 insertions, 0 deletions
diff --git a/src/drivers/android_drv.h b/src/drivers/android_drv.h
index 5f6165d..b7724ff 100644
--- a/src/drivers/android_drv.h
+++ b/src/drivers/android_drv.h
@@ -22,6 +22,8 @@
#define RSSI_CMD "RSSI"
#define LINKSPEED_CMD "LINKSPEED"
+#define MAX_WPSP2PIE_CMD_SIZE 384
+
#define WEXT_PNOSETUP_HEADER "PNOSETUP "
#define WEXT_PNOSETUP_HEADER_SIZE 9
#define WEXT_PNO_TLV_PREFIX 'S'
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index a1cfe37..26a9466 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -60,6 +60,9 @@
#ifdef ANDROID
#include "android_drv.h"
+
+static int wpa_driver_nl80211_driver_cmd(void *priv, char *cmd, char *buf,
+ size_t buf_len);
#endif /* ANDROID */
#ifdef CONFIG_LIBNL20
/* libnl 2.0 compatibility code */
@@ -8999,6 +9002,15 @@ nla_put_failure:
static int nl80211_set_p2p_powersave(void *priv, int legacy_ps, int opp_ps,
int ctwindow)
{
+#ifdef ANDROID_BRCM_P2P_PATCH
+ char buf[MAX_DRV_CMD_SIZE];
+
+ memset(buf, 0, sizeof(buf));
+ wpa_printf(MSG_DEBUG, "%s: Entry", __func__);
+ os_snprintf(buf, sizeof(buf), "P2P_SET_PS %d %d %d", legacy_ps, opp_ps,
+ ctwindow);
+ return wpa_driver_nl80211_driver_cmd(priv, buf, buf, strlen(buf) + 1);
+#else /* ANDROID_BRCM_P2P_PATCH */
struct i802_bss *bss = priv;
wpa_printf(MSG_DEBUG, "nl80211: set_p2p_powersave (legacy_ps=%d "
@@ -9013,6 +9025,7 @@ static int nl80211_set_p2p_powersave(void *priv, int legacy_ps, int opp_ps,
return -1; /* Not yet supported */
return nl80211_set_power_save(bss, legacy_ps);
+#endif /* ANDROID_BRCM_P2P_PATCH */
}
@@ -9365,6 +9378,68 @@ static int wpa_driver_nl80211_driver_cmd(void *priv, char *cmd, char *buf,
return ret;
}
+#ifdef ANDROID_BRCM_P2P_PATCH
+
+static int wpa_driver_set_p2p_noa(void *priv, u8 count, int start,
+ int duration)
+{
+ char buf[MAX_DRV_CMD_SIZE];
+
+ memset(buf, 0, sizeof(buf));
+ wpa_printf(MSG_DEBUG, "%s: Entry", __func__);
+ os_snprintf(buf, sizeof(buf), "P2P_SET_NOA %d %d %d", count, start,
+ duration);
+ return wpa_driver_nl80211_driver_cmd(priv, buf, buf, strlen(buf) + 1);
+}
+
+
+static int wpa_driver_set_ap_wps_p2p_ie(void *priv,
+ const struct wpabuf *beacon,
+ const struct wpabuf *proberesp,
+ const struct wpabuf *assocresp)
+{
+ char buf[MAX_WPSP2PIE_CMD_SIZE];
+ struct wpabuf *ap_wps_p2p_ie = NULL;
+ char *_cmd = "SET_AP_WPS_P2P_IE";
+ char *pbuf;
+ int ret = 0;
+ int i;
+ struct cmd_desc {
+ int cmd;
+ const struct wpabuf *src;
+ } cmd_arr[] = {
+ {0x1, beacon},
+ {0x2, proberesp},
+ {0x4, assocresp},
+ {-1, NULL}
+ };
+
+ wpa_printf(MSG_DEBUG, "%s: Entry", __func__);
+ for (i = 0; cmd_arr[i].cmd != -1; i++) {
+ os_memset(buf, 0, sizeof(buf));
+ pbuf = buf;
+ pbuf += sprintf(pbuf, "%s %d", _cmd, cmd_arr[i].cmd);
+ *pbuf++ = '\0';
+ ap_wps_p2p_ie = cmd_arr[i].src ?
+ wpabuf_dup(cmd_arr[i].src) : NULL;
+ if (ap_wps_p2p_ie) {
+ os_memcpy(pbuf, wpabuf_head(ap_wps_p2p_ie),
+ wpabuf_len(ap_wps_p2p_ie));
+ ret = wpa_driver_nl80211_driver_cmd(
+ priv, buf, buf,
+ os_strlen(_cmd) + 3 +
+ wpabuf_len(ap_wps_p2p_ie));
+ wpabuf_free(ap_wps_p2p_ie);
+ if (ret < 0)
+ break;
+ }
+ }
+
+ return ret;
+}
+
+#endif /* ANDROID_BRCM_P2P_PATCH */
+
#endif /* ANDROID */
@@ -9446,6 +9521,10 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
.send_tdls_mgmt = nl80211_send_tdls_mgmt,
.tdls_oper = nl80211_tdls_oper,
#endif /* CONFIG_TDLS */
+#ifdef ANDROID_BRCM_P2P_PATCH
+ .set_noa = wpa_driver_set_p2p_noa,
+ .set_ap_wps_ie = wpa_driver_set_ap_wps_p2p_ie,
+#endif /* ANDROID_BRCM_P2P_PATCH */
#ifdef ANDROID
.driver_cmd = wpa_driver_nl80211_driver_cmd,
#endif /* ANDROID */