The use of p2p_stop_find to detect p2p support
is not a trusted approach, due to p2p_stop_find currently
implemented in wpa_supplicant does not check p2p
availability, as p2p_find does, for instance. Therefore,
capabilitiy modes property, retrieved on interface added
signal, is a proper way to define if a wifi device has
p2p support.
---
 gsupplicant/gsupplicant.h |  1 +
 gsupplicant/supplicant.c  | 35 +++++++++++------------------------
 2 files changed, 12 insertions(+), 24 deletions(-)

diff --git a/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h
index 387a3aa..344459b 100644
--- a/gsupplicant/gsupplicant.h
+++ b/gsupplicant/gsupplicant.h
@@ -49,6 +49,7 @@ extern "C" {
 #define G_SUPPLICANT_CAPABILITY_MODE_INFRA     (1 << 0)
 #define G_SUPPLICANT_CAPABILITY_MODE_IBSS              (1 << 1)
 #define G_SUPPLICANT_CAPABILITY_MODE_AP                (1 << 2)
+#define G_SUPPLICANT_CAPABILITY_MODE_P2P       (1 << 3)
 
 #define G_SUPPLICANT_KEYMGMT_NONE              (1 << 0)
 #define G_SUPPLICANT_KEYMGMT_IEEE8021X (1 << 1)
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index 1886a40..6337650 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -131,6 +131,7 @@ static struct strvalmap mode_capa_map[] = {
        { "infrastructure",     G_SUPPLICANT_CAPABILITY_MODE_INFRA      },
        { "ad-hoc",             G_SUPPLICANT_CAPABILITY_MODE_IBSS       },
        { "ap",                 G_SUPPLICANT_CAPABILITY_MODE_AP         },
+       { "p2p",                G_SUPPLICANT_CAPABILITY_MODE_P2P        },
        { }
 };
 
@@ -2039,25 +2040,6 @@ static GSupplicantInterface *interface_alloc(const char 
*path)
        return interface;
 }
 
-static void interface_p2p_stop_find(const char *error,
-                                       DBusMessageIter *iter, void *user_data)
-{
-       GSupplicantInterface *interface = user_data;
-
-       if (error) {
-               if (!g_strcmp0(error,
-                               "org.freedesktop.DBus.Error.UnknownMethod")) {
-                       SUPPLICANT_DBG("wpa_supplicant does not support P2P");
-               } else {
-                       SUPPLICANT_DBG("interface %s does not support P2P",
-                                                       interface->ifname);
-               }
-       } else
-               interface->p2p_support = true;
-
-       callback_p2p_support(interface);
-}
-
 static void interface_added(DBusMessageIter *iter, void *user_data)
 {
        GSupplicantInterface *interface;
@@ -2080,22 +2062,27 @@ static void interface_added(DBusMessageIter *iter, void 
*user_data)
        if (!interface)
                return;
 
-       supplicant_dbus_method_call(path,
-               SUPPLICANT_INTERFACE ".Interface.P2PDevice", "StopFind",
-               NULL, interface_p2p_stop_find, interface, interface);
-
        dbus_message_iter_next(iter);
        if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_INVALID) {
                supplicant_dbus_property_foreach(iter, interface_property,
                                                                interface);
                interface_property(NULL, NULL, interface);
-               return;
+               goto p2p_detection;
        }
 
        supplicant_dbus_property_get_all(path,
                                        SUPPLICANT_INTERFACE ".Interface",
                                        interface_property, interface,
                                        interface);
+
+p2p_detection:
+
+       if (interface->mode_capa & G_SUPPLICANT_CAPABILITY_MODE_P2P) {
+               interface->p2p_support = true;
+               callback_p2p_support(interface);
+       }
+
+       return;
 }
 
 static void interface_removed(DBusMessageIter *iter, void *user_data)
-- 
1.9.1

_______________________________________________
connman mailing list
connman@connman.net
https://lists.connman.net/mailman/listinfo/connman

Reply via email to