OSDN Git Service

BRCM P2P update
authorDmitry Shmidt <dimitrysh@google.com>
Tue, 23 Aug 2011 19:30:30 +0000 (12:30 -0700)
committerDmitry Shmidt <dimitrysh@google.com>
Tue, 23 Aug 2011 22:08:20 +0000 (15:08 -0700)
- 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>
src/ap/wpa_auth.c
src/drivers/driver.h
src/drivers/driver_nl80211.c
src/p2p/p2p.c
src/p2p/p2p_sd.c
wpa_supplicant/ctrl_iface.c
wpa_supplicant/events.c
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/wpa_cli.c
wpa_supplicant/wpa_supplicant_i.h

index 3fbb88b..0836887 100644 (file)
@@ -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
        }
 
        /*
index 232f31a..19f732d 100644 (file)
 #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
  */
index ab20e8a..7b7e3fa 100644 (file)
@@ -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 "
index 7147e5c..bef3926 100644 (file)
@@ -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];
        }
 
index 926fc03..9e26873 100644 (file)
@@ -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");
index 64ec284..1ee2d15 100644 (file)
@@ -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;
index 26e355e..2765aef 100644 (file)
@@ -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);
index a0995fe..d8b2e16 100644 (file)
@@ -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
index 3b7f215..3810ee0 100644 (file)
@@ -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
 }
 
 
index 7126db9..62c111d 100644 (file)
@@ -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);