<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000099" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">Hello Johannes,<br>
      <br>
      Does this patch has to be applied on top of the patches submitted
      by David Spinadel or hostap default git checkout code?<br>
      <br>
      Also whether wpa_supplicant has to be started on dummy 'p2p0'
      interface along with WLAN primary interface. Because with out
      that, control socket won't be created on 'p2p0' and which in turn
      is needed by Android framework for P2P operations. <br>
      <br>
      Regards,<br>
      Sreenath<br>
      <br>
      On 04/23/2013 06:17 PM, Johannes Berg wrote:<br>
    </div>
    <blockquote
      cite="mid:1366721263-5553-1-git-send-email-johannes@sipsolutions.net"
      type="cite">
      <pre wrap="">From: Johannes Berg <a class="moz-txt-link-rfc2396E" href="mailto:johannes.berg@intel.com">&lt;johannes.berg@intel.com&gt;</a>

To support Android the kernel may have a "p2p0" netdev for a
P2P-Device even though this isn't very useful, but Android
requires a netdev. To support this in the supplicant, if the
interface mode is P2P_DEVICE, re-set it to the same instead
of STATION mode.

Note that this is only possible with a kernel that creates a
netdev for the P2P-Device wdev.

Change-Id: Ia558cf847e0753b9c77056deee3acc618a63755f
Signed-hostap: Johannes Berg <a class="moz-txt-link-rfc2396E" href="mailto:johannes.berg@intel.com">&lt;johannes.berg@intel.com&gt;</a>
---
 src/drivers/driver_nl80211.c | 50 +++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 45 insertions(+), 5 deletions(-)

diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 3b0dba4..7b14219 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -537,6 +537,7 @@ static void * nl80211_cmd(struct wpa_driver_nl80211_data *drv,
 
 struct wiphy_idx_data {
         int wiphy_idx;
+        enum nl80211_iftype nlmode;
 };
 
 
@@ -552,6 +553,9 @@ static int netdev_info_handler(struct nl_msg *msg, void *arg)
         if (tb[NL80211_ATTR_WIPHY])
                 info-&gt;wiphy_idx = nla_get_u32(tb[NL80211_ATTR_WIPHY]);
 
+        if (tb[NL80211_ATTR_IFTYPE])
+                info-&gt;nlmode = nla_get_u32(tb[NL80211_ATTR_IFTYPE]);
+
         return NL_SKIP;
 }
 
@@ -580,6 +584,30 @@ nla_put_failure:
 }
 
 
+static enum nl80211_iftype nl80211_get_ifmode(struct i802_bss *bss)
+{
+        struct nl_msg *msg;
+        struct wiphy_idx_data data = {
+                .wiphy_idx = -1,
+        };
+
+        msg = nlmsg_alloc();
+        if (!msg)
+                return -1;
+
+        nl80211_cmd(bss-&gt;drv, msg, 0, NL80211_CMD_GET_INTERFACE);
+
+        NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss-&gt;ifindex);
+
+        if (send_and_recv_msgs(bss-&gt;drv, msg, netdev_info_handler, &amp;data) == 0)
+                return data.nlmode;
+        msg = NULL;
+nla_put_failure:
+        nlmsg_free(msg);
+        return NL80211_IFTYPE_UNSPECIFIED;
+}
+
+
 static int nl80211_register_beacons(struct wpa_driver_nl80211_data *drv,
                                     struct nl80211_wiphy_data *w)
 {
@@ -3623,11 +3651,23 @@ wpa_driver_nl80211_finish_drv_init(struct wpa_driver_nl80211_data *drv)
          * dynamically added interface (e.g., P2P) that was already configured
          * with proper iftype.
          */
-        if (drv-&gt;ifindex != drv-&gt;global-&gt;if_add_ifindex &amp;&amp;
-            wpa_driver_nl80211_set_mode(bss, NL80211_IFTYPE_STATION) &lt; 0) {
-                wpa_printf(MSG_ERROR, "nl80211: Could not configure driver to "
-                           "use managed mode");
-                return -1;
+        if (drv-&gt;ifindex != drv-&gt;global-&gt;if_add_ifindex) {
+                enum nl80211_iftype nlmode;
+
+                nlmode = nl80211_get_ifmode(bss);
+                if (nlmode != NL80211_IFTYPE_P2P_DEVICE)
+                        nlmode = NL80211_IFTYPE_STATION;
+
+                if (wpa_driver_nl80211_set_mode(bss, nlmode) &lt; 0) {
+                        wpa_printf(MSG_ERROR, "nl80211: Could not configure "
+                                   "driver to use %s mode",
+                                   nlmode == NL80211_IFTYPE_STATION ?
+                                        "managed" : "P2P-Device");
+                        return -1;
+                }
+
+                /* always use managed mode internally, even for P2P-Device */
+                drv-&gt;nlmode = NL80211_IFTYPE_STATION;
         }
 
         if (linux_set_iface_flags(drv-&gt;global-&gt;ioctl_sock, bss-&gt;ifname, 1)) {
</pre>
    </blockquote>
    <br>
  </body>
</html>