aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Shmidt <dimitrysh@google.com>2012-05-02 12:29:53 -0700
committerDmitry Shmidt <dimitrysh@google.com>2012-05-02 12:31:35 -0700
commit2fb777c379ad560c309c54b96c2c13291da23f54 (patch)
tree000fb15aa1092ccd323a5046b19a33ffa95d246b
parent3eb807eec9a305f9a2bc87964925ec81bfc4eb1e (diff)
downloadwpa_supplicant_8-2fb777c379ad560c309c54b96c2c13291da23f54.tar.gz
wpa_supplicant: Update to Version 0.8.26 from BRCM
- Add interface command - Improve scan handling during P2P BUG: b/6324527, b/6427094 Change-Id: I4425f44d2a15de0725ba4a1b42cc56e10954b314 Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
-rw-r--r--src/p2p/p2p.c62
-rw-r--r--src/p2p/p2p.h9
-rw-r--r--wpa_supplicant/ctrl_iface.c16
-rw-r--r--wpa_supplicant/ctrl_iface_unix.c29
-rw-r--r--wpa_supplicant/events.c34
-rw-r--r--wpa_supplicant/p2p_supplicant.c21
-rw-r--r--wpa_supplicant/wpa_cli.c29
-rw-r--r--wpa_supplicant/wpa_supplicant.c4
-rw-r--r--wpa_supplicant/wpa_supplicant_i.h6
9 files changed, 177 insertions, 33 deletions
diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c
index a4c6a8f3..68dfb8dc 100644
--- a/src/p2p/p2p.c
+++ b/src/p2p/p2p.c
@@ -42,10 +42,38 @@ static void p2p_scan_timeout(void *eloop_ctx, void *timeout_ctx);
* P2P_PEER_EXPIRATION_AGE - Number of seconds after which inactive peer
* entries will be removed
*/
+#ifdef ANDROID_P2P
+#define P2P_PEER_EXPIRATION_AGE 30
+#else
#define P2P_PEER_EXPIRATION_AGE 300
+#endif
#define P2P_PEER_EXPIRATION_INTERVAL (P2P_PEER_EXPIRATION_AGE / 2)
+#ifdef ANDROID_P2P
+int p2p_connection_in_progress(struct p2p_data *p2p)
+{
+ int ret = 0;
+
+ switch (p2p->state) {
+ case P2P_CONNECT:
+ case P2P_CONNECT_LISTEN:
+ case P2P_GO_NEG:
+ case P2P_WAIT_PEER_CONNECT:
+ case P2P_PROVISIONING:
+ case P2P_INVITE:
+ case P2P_INVITE_LISTEN:
+ ret = 1;
+ break;
+
+ default:
+ ret = 0;
+ }
+
+ return ret;
+}
+#endif
+
static void p2p_expire_peers(struct p2p_data *p2p)
{
struct p2p_device *dev, *n;
@@ -82,7 +110,14 @@ static void p2p_expire_peers(struct p2p_data *p2p)
continue;
}
- wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Expiring old peer "
+#ifdef ANDROID_P2P
+ /* If Connection is in progress, don't expire the peer
+ */
+ if (p2p_connection_in_progress(p2p))
+ continue;
+#endif
+
+ wpa_msg(p2p->cfg->msg_ctx, MSG_ERROR, "P2P: Expiring old peer "
"entry " MACSTR, MAC2STR(dev->info.p2p_device_addr));
dl_list_del(&dev->list);
p2p_device_free(p2p, dev);
@@ -996,6 +1031,18 @@ int p2p_find(struct p2p_data *p2p, unsigned int timeout,
return res;
}
+#ifdef ANDROID_P2P
+int p2p_search_pending(struct p2p_data *p2p)
+{
+ if(p2p == NULL)
+ return 0;
+
+ if(p2p->state == P2P_SEARCH_WHEN_READY)
+ return 1;
+
+ return 0;
+}
+#endif
int p2p_other_scan_completed(struct p2p_data *p2p)
{
@@ -2094,7 +2141,6 @@ int p2p_parse_dev_addr(const u8 *ies, size_t ies_len, u8 *dev_addr)
{
struct wpabuf *p2p_ie;
struct p2p_message msg;
- int ret = -1;
p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len,
P2P_IE_VENDOR_TYPE);
@@ -2106,16 +2152,14 @@ int p2p_parse_dev_addr(const u8 *ies, size_t ies_len, u8 *dev_addr)
return -1;
}
- if (msg.p2p_device_addr) {
- os_memcpy(dev_addr, msg.p2p_device_addr, ETH_ALEN);
- ret = 0;
- } else if (msg.device_id) {
- os_memcpy(dev_addr, msg.device_id, ETH_ALEN);
- ret = 0;
+ if (msg.p2p_device_addr == NULL) {
+ wpabuf_free(p2p_ie);
+ return -1;
}
+ os_memcpy(dev_addr, msg.p2p_device_addr, ETH_ALEN);
wpabuf_free(p2p_ie);
- return ret;
+ return 0;
}
diff --git a/src/p2p/p2p.h b/src/p2p/p2p.h
index 6e3f232b..fe98f5eb 100644
--- a/src/p2p/p2p.h
+++ b/src/p2p/p2p.h
@@ -1616,11 +1616,18 @@ int p2p_in_progress(struct p2p_data *p2p);
#ifdef ANDROID_P2P
/**
- * p2p_in_progress - Check whether a P2P SEARCH is in progress
+ * p2p_search_in_progress - Check whether a P2P SEARCH is in progress
* @p2p: P2P module context from p2p_init()
* Returns: 0 if P2P module is idle or 1 if an operation is in progress
*/
int p2p_search_in_progress(struct p2p_data *p2p);
+
+/**
+ * p2p_search_pending - Check whether there is a deferred P2P SEARCH
+ * @p2p: P2P module context from p2p_init()
+ * Returns: 0 if there is no deferred P2P search or 1 if there is one
+ */
+int p2p_search_pending(struct p2p_data *p2p);
#endif
/**
diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index caecf75c..06b725b2 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -3307,17 +3307,17 @@ static int p2p_ctrl_set(struct wpa_supplicant *wpa_s, char *cmd)
return 0;
}
#ifdef ANDROID_P2P
- if (os_strcmp(cmd, "conc_priority") == 0) {
- if(os_strncmp(cmd+strlen("conc_priority")+1, "sta", 3) == 0)
- os_strncpy(wpa_s->global->conc_priority, "sta", 3);
- else if(os_strncmp(cmd+strlen("conc_priority")+1, "p2p", 3) == 0)
- os_strncpy(wpa_s->global->conc_priority, "p2p", 3);
+ if (os_strcmp(cmd, "conc_pref") == 0) {
+ if (os_strcmp(param, "sta") == 0)
+ wpa_s->global->conc_pref = WPA_CONC_PREF_STA;
+ else if (os_strcmp(param, "p2p") == 0)
+ wpa_s->global->conc_pref = WPA_CONC_PREF_P2P;
else {
- wpa_printf(MSG_ERROR, " conc_priority arg should be either sta or p2p");
+ wpa_printf(MSG_INFO, "Invalid conc_pref value");
return -1;
}
- wpa_printf(MSG_DEBUG, "Single Channel Concurrency: Prioritize %s",
- wpa_s->global->conc_priority);
+ wpa_printf(MSG_DEBUG, "Single channel concurrency preference: "
+ "%s", param);
return 0;
}
#endif
diff --git a/wpa_supplicant/ctrl_iface_unix.c b/wpa_supplicant/ctrl_iface_unix.c
index 65136041..b4af7934 100644
--- a/wpa_supplicant/ctrl_iface_unix.c
+++ b/wpa_supplicant/ctrl_iface_unix.c
@@ -164,6 +164,35 @@ static void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx,
else
reply_len = 2;
} else {
+#if defined(CONFIG_P2P) && defined(ANDROID_P2P)
+ char *ifname = NULL, *arg;
+ char cmd[256];
+ /* Skip the command name */
+ arg = os_strchr(buf, ' ');
+ if (arg) {
+ *arg++ = '\0';
+ os_strncpy(cmd, buf, sizeof(cmd));
+ /* Now search for interface= */
+ if (os_strncmp(arg, "interface=", 10) == 0) {
+ ifname = arg + 10;
+ arg = os_strchr(ifname, ' ');
+ if (arg)
+ *arg++ = '\0';
+ wpa_printf(MSG_DEBUG, "Found interface= in the arg %s ifname %s", arg, ifname);
+ for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
+ if (os_strcmp(wpa_s->ifname, ifname) == 0)
+ break;
+ }
+ if (wpa_s == NULL) {
+ wpa_printf(MSG_ERROR, "P2P: interface=%s does not exist", ifname);
+ wpa_s = eloop_ctx;
+ }
+ }
+ if (arg)
+ os_snprintf(buf, sizeof(buf), "%s %s", cmd, arg);
+ }
+ wpa_printf(MSG_DEBUG, "wpa_s %p cmd %s", wpa_s, buf);
+#endif /* defined CONFIG_P2P && defined ANDROID_P2P */
reply = wpa_supplicant_ctrl_iface_process(wpa_s, buf,
&reply_len);
}
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index c09245d2..c6d91e86 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -1017,7 +1017,11 @@ static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
wpa_supplicant_notify_scanning(wpa_s, 0);
#ifdef CONFIG_P2P
+#ifdef ANDROID_P2P
+ if (p2p_search_pending(wpa_s->global->p2p) && !wpa_s->global->p2p_disabled &&
+#else
if (wpa_s->p2p_cb_on_scan_complete && !wpa_s->global->p2p_disabled &&
+#endif
wpa_s->global->p2p != NULL) {
wpa_s->p2p_cb_on_scan_complete = 0;
if (p2p_other_scan_completed(wpa_s->global->p2p) == 1) {
@@ -1196,18 +1200,26 @@ static void wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
if (rn2 && os_strcmp(rn, rn2) == 0) {
wpa_printf(MSG_DEBUG, "%s: Updating scan results from "
"sibling", ifs->ifname);
-#ifndef ANDROID_P2P
- _wpa_supplicant_event_scan_results(ifs, data);
+#ifdef ANDROID_P2P
+ if ( (ifs->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) || (ifs->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)) {
+ /* Do not update the scan results from STA interface to p2p interfaces */
+ wpa_printf(MSG_DEBUG, "Not Updating scan results on interface %s from "
+ "sibling %s", ifs->ifname, wpa_s->ifname);
+ continue;
+ }
+ else {
+ /* P2P_FIND will result in too many SCAN_RESULT_EVENTS within
+ * no time. Avoid announcing it to application as it may not
+ * be that useful (since results will be that of only 1,6,11).
+ * over to any other interface as it
+ */
+ if(p2p_search_in_progress(wpa_s->global->p2p))
+ _wpa_supplicant_event_scan_results(ifs, data, 1);
+ else
+ _wpa_supplicant_event_scan_results(ifs, data, 0);
+ }
#else
- /* P2P_FIND will result in too many SCAN_RESULT_EVENTS within
- * no time. Avoid announcing it to application as it may not
- * be that useful (since results will be that of only 1,6,11).
- * over to any other interface as it
- */
- if((wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) && p2p_search_in_progress(wpa_s->global->p2p))
- _wpa_supplicant_event_scan_results(ifs, data, 1);
- else
- _wpa_supplicant_event_scan_results(ifs, data, 0);
+ _wpa_supplicant_event_scan_results(ifs, data);
#endif
}
}
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index 5e7edc8c..f9317a8e 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -47,7 +47,6 @@
#define P2P_MAX_CLIENT_IDLE 10
#endif /* P2P_MAX_CLIENT_IDLE */
-
static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx);
static struct wpa_supplicant *
wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
@@ -63,6 +62,22 @@ static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s);
static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx);
static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s);
+#ifdef ANDROID_P2P
+static int wpas_global_scan_in_progress(struct wpa_supplicant *wpa_s)
+{
+ struct wpa_supplicant *iface = NULL;
+
+ for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
+ if(iface->scanning || iface->wpa_state == WPA_SCANNING) {
+ wpa_printf(MSG_DEBUG, "P2P: Scan in progress on %s,"
+ "defer P2P SEARCH", iface->ifname);
+ return 1;
+ }
+ }
+
+ return 0;
+}
+#endif
static void wpas_p2p_scan_res_handler(struct wpa_supplicant *wpa_s,
struct wpa_scan_results *scan_res)
@@ -157,7 +172,11 @@ static int wpas_p2p_scan(void *ctx, enum p2p_scan_type type, int freq,
if (ret) {
wpa_s->scan_res_handler = NULL;
+#ifdef ANDROID_P2P
+ if (wpa_s->scanning || was_in_p2p_scan || wpas_global_scan_in_progress(wpa_s)) {
+#else
if (wpa_s->scanning || was_in_p2p_scan) {
+#endif
wpa_s->p2p_cb_on_scan_complete = 1;
ret = 1;
}
diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c
index 43bcc558..46859709 100644
--- a/wpa_supplicant/wpa_cli.c
+++ b/wpa_supplicant/wpa_cli.c
@@ -80,6 +80,9 @@ static const char *pid_file = NULL;
static const char *action_file = NULL;
static int ping_interval = 5;
static int interactive = 0;
+#if defined(CONFIG_P2P) && defined(ANDROID_P2P)
+static char* redirect_interface = NULL;
+#endif
struct cli_txt_entry {
struct dl_list list;
@@ -400,6 +403,9 @@ static int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print)
#else
char buf[2048];
#endif
+#if defined(CONFIG_P2P) && defined(ANDROID_P2P)
+ char _cmd[256];
+#endif
size_t len;
int ret;
@@ -407,6 +413,22 @@ static int _wpa_ctrl_command(struct wpa_ctrl *ctrl, char *cmd, int print)
printf("Not connected to wpa_supplicant - command dropped.\n");
return -1;
}
+#if defined(CONFIG_P2P) && defined(ANDROID_P2P)
+ if (redirect_interface) {
+ char *arg;
+ arg = os_strchr(cmd, ' ');
+ if (arg) {
+ *arg++ = '\0';
+ ret = os_snprintf(_cmd, sizeof(_cmd), "%s %s %s", cmd, redirect_interface, arg);
+ }
+ else {
+ ret = os_snprintf(_cmd, sizeof(_cmd), "%s %s", cmd, redirect_interface);
+ }
+ cmd = _cmd;
+ os_free(redirect_interface);
+ redirect_interface = NULL;
+ }
+#endif
len = sizeof(buf) - 1;
ret = wpa_ctrl_request(ctrl, cmd, os_strlen(cmd), buf, &len,
wpa_cli_msg_cb);
@@ -3192,6 +3214,13 @@ static int wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
printf("Unknown command '%s'\n", argv[0]);
ret = 1;
} else {
+#if defined(CONFIG_P2P) && defined(ANDROID_P2P)
+ if ( (argc >= 2) && (os_strncmp(argv[1], "interface=", 10) == 0)) {
+ redirect_interface = os_strdup(argv[1]);
+ ret = match->handler(ctrl, argc - 2, &argv[2]);
+ }
+ else
+#endif
ret = match->handler(ctrl, argc - 1, &argv[1]);
}
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 81d00f30..3b184fd7 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -3126,9 +3126,9 @@ int wpas_driver_bss_selection(struct wpa_supplicant *wpa_s)
#ifdef ANDROID_P2P
int wpas_is_p2p_prioritized(struct wpa_supplicant *wpa_s)
{
- if(os_strncmp(wpa_s->global->conc_priority, "p2p", 3) == 0)
+ if (wpa_s->global->conc_pref == WPA_CONC_PREF_P2P)
return 1;
- else if(os_strncmp(wpa_s->global->conc_priority, "sta", 3) == 0)
+ if (wpa_s->global->conc_pref == WPA_CONC_PREF_STA)
return 0;
/* IF conc_priority is not set, return -1 */
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index 74a0dde6..21fe5cc4 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -220,7 +220,11 @@ struct wpa_global {
struct dl_list p2p_srv_upnp; /* struct p2p_srv_upnp */
int p2p_disabled;
#ifdef ANDROID_P2P
- char conc_priority[5]; /* "sta" or "p2p" */
+ enum wpa_conc_pref {
+ WPA_CONC_PREF_NOT_SET,
+ WPA_CONC_PREF_STA,
+ WPA_CONC_PREF_P2P
+ } conc_pref;
#endif
int cross_connection;
};