diff options
author | Dmitry Shmidt <dimitrysh@google.com> | 2011-08-23 12:30:30 -0700 |
---|---|---|
committer | Dmitry Shmidt <dimitrysh@google.com> | 2011-08-23 15:08:20 -0700 |
commit | 44da0253a740e0329b18f60c196e1f2dcacfccea (patch) | |
tree | aa74342906dc993edfc839ad9bfbae28abb508b9 | |
parent | e25ba1592df19d46a7a1e1a1fca1fb02ebd7be8f (diff) | |
download | external_wpa_supplicant_8-44da0253a740e0329b18f60c196e1f2dcacfccea.zip external_wpa_supplicant_8-44da0253a740e0329b18f60c196e1f2dcacfccea.tar.gz external_wpa_supplicant_8-44da0253a740e0329b18f60c196e1f2dcacfccea.tar.bz2 |
BRCM P2P update
- IFNAME for monitor interface is changed to m. from mon. This will
give extra space for incrementing X in IFNAME (p2p-wlan0-X). Also, we
have synced the reset of IFNAME w.r.t. monitor interface name.
- Fixed continuous P2P_DEV_FOUND events coming from GO. Removed the
BRCM specific change for this.
- Fixed STATUS command for p2p interface.
Change-Id: I04210dd0b2bdba06b0192c0a61edfa0e5b47ab72
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
-rw-r--r-- | src/ap/wpa_auth.c | 4 | ||||
-rw-r--r-- | src/drivers/driver.h | 8 | ||||
-rw-r--r-- | src/drivers/driver_nl80211.c | 23 | ||||
-rw-r--r-- | src/p2p/p2p.c | 4 | ||||
-rw-r--r-- | src/p2p/p2p_sd.c | 4 | ||||
-rw-r--r-- | wpa_supplicant/ctrl_iface.c | 17 | ||||
-rw-r--r-- | wpa_supplicant/events.c | 30 | ||||
-rw-r--r-- | wpa_supplicant/p2p_supplicant.c | 16 | ||||
-rw-r--r-- | wpa_supplicant/wpa_cli.c | 5 | ||||
-rw-r--r-- | wpa_supplicant/wpa_supplicant_i.h | 4 |
10 files changed, 94 insertions, 21 deletions
diff --git a/src/ap/wpa_auth.c b/src/ap/wpa_auth.c index 3fbb88b..0836887 100644 --- a/src/ap/wpa_auth.c +++ b/src/ap/wpa_auth.c @@ -349,6 +349,10 @@ static struct wpa_group * wpa_group_init(struct wpa_authenticator *wpa_auth, wpa_printf(MSG_INFO, "WPA: Not enough entropy in random pool " "for secure operations - update keys later when " "the first station connects"); +#ifdef ANDROID_BRCM_P2P_PATCH + os_free(group); + return NULL; +#endif } /* diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 232f31a..19f732d 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -35,6 +35,14 @@ #define HOSTAPD_CHAN_HT40MINUS 0x00000020 #define HOSTAPD_CHAN_HT40 0x00000040 +#ifdef ANDROID_BRCM_P2P_PATCH +/** + * Monitor interface name is derived from p2p interface name + * We need to reset p2p interface name early to take care of extra character in + */ +#define WPA_MONITOR_IFNAME_PREFIX "m." +#endif + /** * struct hostapd_channel_data - Channel information */ diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index ab20e8a..7b7e3fa 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -644,12 +644,12 @@ static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv, const struct ieee80211_mgmt *mgmt; union wpa_event_data event; u16 status; -#ifdef ANDROID_BRCM_P2P_PATCH +#ifdef ANDROID_BRCM_P2P_PATCH struct wpa_supplicant *wpa_s = drv->ctx; #endif mgmt = (const struct ieee80211_mgmt *) frame; -#if (defined (CONFIG_AP) || defined (HOSTAPD) ) && defined (ANDROID_BRCM_P2P_PATCH) +#if (defined (CONFIG_AP) || defined (HOSTAPD) ) && defined (ANDROID_BRCM_P2P_PATCH) if (drv->nlmode == NL80211_IFTYPE_AP || drv->nlmode == NL80211_IFTYPE_P2P_GO) { if (len < 24 + sizeof(mgmt->u.assoc_req)) { wpa_printf(MSG_DEBUG, "nl80211: Too short association event " @@ -696,7 +696,7 @@ static void mlme_event_assoc(struct wpa_driver_nl80211_data *drv, } event.assoc_info.freq = drv->assoc_freq; -#if (defined (CONFIG_AP) || defined(HOSTAPD)) && defined (ANDROID_BRCM_P2P_PATCH) +#if (defined (CONFIG_AP) || defined(HOSTAPD)) && defined (ANDROID_BRCM_P2P_PATCH) } #endif wpa_supplicant_event(drv->ctx, EVENT_ASSOC, &event); @@ -886,7 +886,7 @@ static void mlme_event_deauth_disassoc(struct wpa_driver_nl80211_data *drv, reason_code = le_to_host16(mgmt->u.deauth.reason_code); if (type == EVENT_DISASSOC) { -#ifdef ANDROID_BRCM_P2P_PATCH +#ifdef ANDROID_BRCM_P2P_PATCH if (drv->nlmode == NL80211_IFTYPE_AP || drv->nlmode == NL80211_IFTYPE_P2P_GO) { event.disassoc_info.addr = mgmt->sa; @@ -900,7 +900,7 @@ static void mlme_event_deauth_disassoc(struct wpa_driver_nl80211_data *drv, mgmt->u.disassoc.variable; } } else { -#ifdef ANDROID_BRCM_P2P_PATCH +#ifdef ANDROID_BRCM_P2P_PATCH if (drv->nlmode == NL80211_IFTYPE_AP || drv->nlmode == NL80211_IFTYPE_P2P_GO) { event.deauth_info.addr = mgmt->sa; @@ -3767,7 +3767,7 @@ static int wpa_driver_nl80211_set_beacon(void *priv, int ret; int beacon_set; int ifindex = if_nametoindex(bss->ifname); -#ifdef ANDROID_BRCM_P2P_PATCH +#ifdef ANDROID_BRCM_P2P_PATCH beacon_set = 1; #else beacon_set = bss->beacon_set; @@ -3833,7 +3833,7 @@ static int wpa_driver_nl80211_set_freq(struct wpa_driver_nl80211_data *drv, NL80211_CHAN_HT40PLUS); break; default: -#ifndef ANDROID_BRCM_P2P_PATCH +#ifndef ANDROID_BRCM_P2P_PATCH /* Should be change to HT20 as a default value because P2P firmware does not support 11n for BCM4329 */ NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_CHANNEL_TYPE, NL80211_CHAN_HT20); @@ -4346,8 +4346,11 @@ nl80211_create_monitor_interface(struct wpa_driver_nl80211_data *drv) struct sockaddr_ll ll; int optval; socklen_t optlen; - +#ifdef ANDROID_BRCM_P2P_PATCH + snprintf(buf, IFNAMSIZ, "%s%s", WPA_MONITOR_IFNAME_PREFIX, drv->first_bss.ifname); +#else snprintf(buf, IFNAMSIZ, "mon.%s", drv->first_bss.ifname); +#endif buf[IFNAMSIZ - 1] = '\0'; drv->monitor_ifidx = @@ -6138,7 +6141,7 @@ static int nl80211_send_frame_cmd(struct wpa_driver_nl80211_data *drv, NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, drv->ifindex); NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq); -#ifndef ANDROID_BRCM_P2P_PATCH +#ifndef ANDROID_BRCM_P2P_PATCH NLA_PUT_U32(msg, NL80211_ATTR_DURATION, wait); #endif NLA_PUT_FLAG(msg, NL80211_ATTR_OFFCHANNEL_TX_OK); @@ -6370,7 +6373,7 @@ static int wpa_driver_nl80211_probe_req_report(void *priv, int report) goto out_err3; } -#ifdef ANDROID_BRCM_P2P_PATCH +#ifdef ANDROID_BRCM_P2P_PATCH if (drv->nlmode != NL80211_IFTYPE_AP && drv->nlmode != NL80211_IFTYPE_P2P_GO) { wpa_printf(MSG_DEBUG, "nl80211: probe_req_report control only " diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c index 7147e5c..bef3926 100644 --- a/src/p2p/p2p.c +++ b/src/p2p/p2p.c @@ -464,10 +464,6 @@ static void p2p_copy_wps_info(struct p2p_device *dev, int probe_req, if (msg->capability) { dev->info.dev_capab = msg->capability[0]; -#ifdef ANDROID_BRCM_P2P_PATCH - if( dev->info.group_capab != msg->capability[1]) - dev->flags &= ~P2P_DEV_REPORTED; -#endif dev->info.group_capab = msg->capability[1]; } diff --git a/src/p2p/p2p_sd.c b/src/p2p/p2p_sd.c index 926fc03..9e26873 100644 --- a/src/p2p/p2p_sd.c +++ b/src/p2p/p2p_sd.c @@ -451,7 +451,11 @@ void p2p_sd_response(struct p2p_data *p2p, int freq, const u8 *dst, p2p->pending_action_state = P2P_NO_PENDING_ACTION; if (p2p_send_action(p2p, freq, dst, p2p->cfg->dev_addr, + #ifdef ANDROID_BRCM_P2P_PATCH + p2p->cfg->p2p_dev_addr, + #else p2p->cfg->dev_addr, + #endif wpabuf_head(resp), wpabuf_len(resp), 200) < 0) wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Failed to send Action frame"); diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index 64ec284..1ee2d15 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -351,7 +351,7 @@ static int wpa_supplicant_ctrl_iface_wps_pin(struct wpa_supplicant *wpa_s, char *pin; int ret; -#if defined ANDROID_BRCM_P2P_PATCH && defined CONFIG_AP +#if defined(ANDROID_BRCM_P2P_PATCH) && defined(CONFIG_AP) struct wpa_supplicant *iface; #endif @@ -367,7 +367,7 @@ static int wpa_supplicant_ctrl_iface_wps_pin(struct wpa_supplicant *wpa_s, return -1; } -#if defined ANDROID_BRCM_P2P_PATCH && defined CONFIG_AP +#if defined(ANDROID_BRCM_P2P_PATCH) && defined(CONFIG_AP) for (iface = wpa_s->global->ifaces; iface; iface = iface->next) { if (iface->ap_iface){ wpa_printf(MSG_DEBUG, "CTRL_IFACE WPS_PIN: iface 0x%08x wpa_s->ap_iface %p", iface, iface->ap_iface); @@ -790,6 +790,19 @@ static int wpa_supplicant_ctrl_iface_status(struct wpa_supplicant *wpa_s, char *pos, *end, tmp[30]; int res, verbose, ret; +#if defined(ANDROID_BRCM_P2P_PATCH) && defined(CONFIG_P2P) + /* We have to send status command to p2p interface if p2p_interface is started + * otherwise we can send it to primary interface + */ + struct wpa_supplicant* ifs; + for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) { + if ( (ifs->p2p_group_interface == P2P_GROUP_INTERFACE_GO ) ||(ifs->p2p_group_interface == P2P_GROUP_INTERFACE_CLIENT )) { + wpa_s = ifs; + break; + } + } +#endif /* defined ANDROID_BRCM_P2P_PATCH && defined CONFIG_P2P */ + verbose = os_strcmp(params, "-VERBOSE") == 0; pos = buf; end = buf + buflen; diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index 26e355e..2765aef 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -700,8 +700,11 @@ static void wpa_supplicant_req_new_scan(struct wpa_supplicant *wpa_s, wpa_supplicant_req_scan(wpa_s, timeout_sec, timeout_usec); } - +#ifdef ANDROID_BRCM_P2P_PATCH +int wpa_supplicant_connect(struct wpa_supplicant *wpa_s, +#else void wpa_supplicant_connect(struct wpa_supplicant *wpa_s, +#endif /* ANDROID_BRCM_P2P_PATCH */ struct wpa_bss *selected, struct wpa_ssid *ssid) { @@ -709,14 +712,23 @@ void wpa_supplicant_connect(struct wpa_supplicant *wpa_s, wpa_msg(wpa_s, MSG_INFO, WPS_EVENT_OVERLAP "PBC session overlap"); #ifdef CONFIG_P2P - if (wpas_p2p_notif_pbc_overlap(wpa_s) == 1) + if (wpas_p2p_notif_pbc_overlap(wpa_s) == 1) { +#ifdef ANDROID_BRCM_P2P_PATCH + return -1; +#else return; +#endif + } #endif /* CONFIG_P2P */ #ifdef CONFIG_WPS wpas_wps_cancel(wpa_s); #endif /* CONFIG_WPS */ +#ifdef ANDROID_BRCM_P2P_PATCH + return -1; +#else return; +#endif /* ANDROID_BRCM_P2P_PATCH */ } /* @@ -737,7 +749,11 @@ void wpa_supplicant_connect(struct wpa_supplicant *wpa_s, 0))) { if (wpa_supplicant_scard_init(wpa_s, ssid)) { wpa_supplicant_req_new_scan(wpa_s, 10, 0); +#ifdef ANDROID_BRCM_P2P_PATCH + return 0; +#else return; +#endif } wpa_msg(wpa_s, MSG_DEBUG, "Request association: " "reassociate: %d selected: "MACSTR " bssid: " MACSTR @@ -750,6 +766,9 @@ void wpa_supplicant_connect(struct wpa_supplicant *wpa_s, wpa_dbg(wpa_s, MSG_DEBUG, "Already associated with the " "selected AP"); } +#ifdef ANDROID_BRCM_P2P_PATCH + return 0; +#endif } @@ -975,7 +994,14 @@ static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s, wpa_scan_results_free(scan_res); if (skip) return 0; +#ifdef ANDROID_BRCM_P2P_PATCH + if (wpa_supplicant_connect(wpa_s, selected, ssid) < 0) { + wpa_dbg(wpa_s, MSG_DEBUG, "Connect Failed"); + return -1; + } +#else wpa_supplicant_connect(wpa_s, selected, ssid); +#endif wpa_supplicant_rsn_preauth_scan_results(wpa_s); } else { wpa_scan_results_free(scan_res); diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index a0995fe..d8b2e16 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -1017,7 +1017,16 @@ static int wpas_p2p_add_group_interface(struct wpa_supplicant *wpa_s, os_snprintf(ifname, sizeof(ifname), "p2p-%s-%d", wpa_s->ifname, wpa_s->p2p_group_idx); - if (os_strlen(ifname) >= IFNAMSIZ && + +#ifdef ANDROID_BRCM_P2P_PATCH + /** + * Monitor interface name is derived from p2p interface name + * We need to reset p2p interface name early to take care of extra character in monitor interface name + */ + if (os_strlen(ifname) + os_strlen(WPA_MONITOR_IFNAME_PREFIX) >= IFNAMSIZ && +#else + if (os_strlen(ifname) >= IFNAMSIZ && +#endif os_strlen(wpa_s->ifname) < IFNAMSIZ) { /* Try to avoid going over the IFNAMSIZ length limit */ os_snprintf(ifname, sizeof(ifname), "p2p-%d", @@ -3677,7 +3686,7 @@ int wpas_p2p_assoc_req_ie(struct wpa_supplicant *wpa_s, struct wpa_bss *bss, return -1; p2p_ie = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE); -#ifdef ANDROID_BRCM_P2P_PATCH +#ifdef ANDROID_BRCM_P2P_PATCH if (p2p_ie == NULL) return -1; #endif ret = p2p_assoc_req_ie(wpa_s->global->p2p, bss->bssid, buf, len, @@ -4015,7 +4024,8 @@ void wpas_p2p_group_remove_notif(struct wpa_supplicant *wpa_s, u16 reason_code) wpa_printf(MSG_DEBUG, "P2P: [EVENT_DEAUTH] Removing P2P_CLIENT virtual intf."); wpa_supplicant_cancel_scan(wpa_s); - wpas_p2p_interface_unavailable(wpa_s); + wpa_s->removal_reason = P2P_GROUP_REMOVAL_UNAVAILABLE; + wpas_p2p_group_delete(wpa_s); } } #endif diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c index 3b7f215..3810ee0 100644 --- a/wpa_supplicant/wpa_cli.c +++ b/wpa_supplicant/wpa_cli.c @@ -2969,6 +2969,11 @@ static void wpa_cli_action_process(const char *msg) printf("wpa_supplicant is terminating - stop monitoring\n"); wpa_cli_quit = 1; } +#ifdef ANDROID_BRCM_P2P_PATCH + else if (str_match(pos, P2P_EVENT_GO_NEG_FAILURE)) { + wpa_cli_exec(action_file, ctrl_ifname, pos); + } +#endif } diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 7126db9..62c111d 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -637,7 +637,11 @@ void wpas_connection_failed(struct wpa_supplicant *wpa_s, const u8 *bssid); /* events.c */ void wpa_supplicant_mark_disassoc(struct wpa_supplicant *wpa_s); +#ifdef ANDROID_BRCM_P2P_PATCH +int wpa_supplicant_connect(struct wpa_supplicant *wpa_s, +#else void wpa_supplicant_connect(struct wpa_supplicant *wpa_s, +#endif /* ANDROID_BRCM_P2P_PATCH */ struct wpa_bss *selected, struct wpa_ssid *ssid); |