This call will be raised if only a peer support both WPS pbc and pin
method and is not currently advertizing for pbc, thus the need for the
user to tell which method is necessary to proceed with the connection.
---
 src/peer.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 51 insertions(+), 8 deletions(-)

diff --git a/src/peer.c b/src/peer.c
index 08fd8e7..f4fa9de 100644
--- a/src/peer.c
+++ b/src/peer.c
@@ -451,6 +451,50 @@ static void peer_removed(struct connman_peer *peer)
        peer_schedule_changed();
 }
 
+static const char *get_dbus_sender(struct connman_peer *peer)
+{
+       if (!peer->pending)
+               return NULL;
+
+       return dbus_message_get_sender(peer->pending);
+}
+
+static void request_authorization_cb(struct connman_peer *peer,
+                                       bool choice_done, const char *wpspin,
+                                       const char *error, void *user_data)
+{
+       enum connman_peer_wps_method wps_method;
+       int err;
+
+       DBG("RequestInput return, %p", peer);
+
+       if (error) {
+               if (g_strcmp0(error,
+                               "net.connman.Agent.Error.Canceled") == 0) {
+                       err = -EINVAL;
+                       goto out;
+               }
+       }
+
+       if (!choice_done || !peer_driver->connect) {
+               err = -EINVAL;
+               goto out;
+       }
+
+       if (!wpspin)
+               wps_method = CONNMAN_PEER_WPS_PBC;
+       else
+               wps_method = CONNMAN_PEER_WPS_PIN;
+
+       err = peer_driver->connect(peer, wps_method, wpspin);
+       if (err == -EINPROGRESS)
+               return;
+
+out:
+       reply_pending(peer, EIO);
+       connman_peer_set_state(peer, CONNMAN_PEER_STATE_IDLE);
+}
+
 static int peer_connect(struct connman_peer *peer)
 {
        int err = -ENOTSUP;
@@ -459,6 +503,12 @@ static int peer_connect(struct connman_peer *peer)
                err = peer_driver->connect(peer,
                                        CONNMAN_PEER_WPS_UNKNOWN, NULL);
 
+       if (err == -ENOKEY) {
+               err = __connman_agent_request_peer_authorization(peer,
+                                               request_authorization_cb, true,
+                                               get_dbus_sender(peer), NULL);
+       }
+
        return err;
 }
 
@@ -466,6 +516,7 @@ static int peer_disconnect(struct connman_peer *peer)
 {
        int err = -ENOTSUP;
 
+       connman_agent_cancel(peer);
        reply_pending(peer, ECONNABORTED);
 
        if (peer->connection_master)
@@ -683,14 +734,6 @@ static void report_error_cb(void *user_context, bool 
retry, void *user_data)
        peer->sub_device = NULL;
 }
 
-static const char *get_dbus_sender(struct connman_peer *peer)
-{
-       if (!peer->pending)
-               return NULL;
-
-       return dbus_message_get_sender(peer->pending);
-}
-
 static int manage_peer_error(struct connman_peer *peer)
 {
        int err;
-- 
1.8.5.5

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

Reply via email to