diff options
author | Dmitry Shmidt <dimitrysh@google.com> | 2012-05-02 12:29:53 -0700 |
---|---|---|
committer | Dmitry Shmidt <dimitrysh@google.com> | 2012-05-02 12:31:35 -0700 |
commit | 2fb777c379ad560c309c54b96c2c13291da23f54 (patch) | |
tree | 000fb15aa1092ccd323a5046b19a33ffa95d246b | |
parent | 3eb807eec9a305f9a2bc87964925ec81bfc4eb1e (diff) | |
download | wpa_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.c | 62 | ||||
-rw-r--r-- | src/p2p/p2p.h | 9 | ||||
-rw-r--r-- | wpa_supplicant/ctrl_iface.c | 16 | ||||
-rw-r--r-- | wpa_supplicant/ctrl_iface_unix.c | 29 | ||||
-rw-r--r-- | wpa_supplicant/events.c | 34 | ||||
-rw-r--r-- | wpa_supplicant/p2p_supplicant.c | 21 | ||||
-rw-r--r-- | wpa_supplicant/wpa_cli.c | 29 | ||||
-rw-r--r-- | wpa_supplicant/wpa_supplicant.c | 4 | ||||
-rw-r--r-- | wpa_supplicant/wpa_supplicant_i.h | 6 |
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; }; |