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