[PATCH 07/16] peer: Manage peer connection properly through an Agent report

2014-08-06 Thread Tomasz Bursztyka
Thus the upper layer, if providing an agent, will get a report from
connman and it will be possible at this point to ask for a proper retry.
---
 src/peer.c | 68 ++
 1 file changed, 55 insertions(+), 13 deletions(-)

diff --git a/src/peer.c b/src/peer.c
index 50df50e..feb8e75 100644
--- a/src/peer.c
+++ b/src/peer.c
@@ -27,6 +27,8 @@
 #include gdbus.h
 #include gdhcp/gdhcp.h
 
+#include connman/agent.h
+
 #include connman.h
 
 static DBusConnection *connection = NULL;
@@ -464,6 +466,7 @@ static int peer_disconnect(struct connman_peer *peer)
 {
int err = -ENOTSUP;
 
+   connman_agent_cancel(peer);
reply_pending(peer, ECONNABORTED);
 
if (peer-connection_master)
@@ -660,6 +663,55 @@ static int start_dhcp_client(struct connman_peer *peer)
return __connman_dhcp_start(peer-ipconfig, NULL, dhcp_callback, peer);
 }
 
+static void report_error_cb(void *user_context, bool retry, void *user_data)
+{
+   struct connman_peer *peer = user_context;
+
+   if (retry) {
+   int err;
+   err = peer_connect(peer);
+
+   if (err == 0 || err == -EINPROGRESS)
+   return;
+   }
+
+   reply_pending(peer, ENOTCONN);
+
+   peer_disconnect(peer);
+
+   if (!peer-connection_master) {
+   __connman_dhcp_stop(peer-ipconfig);
+   __connman_ipconfig_disable(peer-ipconfig);
+   } else
+   stop_dhcp_server(peer);
+
+   peer-connection_master = false;
+   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;
+
+   err = __connman_agent_report_peer_error(peer, peer-path,
+   connect-failed, report_error_cb,
+   get_dbus_sender(peer), NULL);
+   if (err != -EINPROGRESS) {
+   report_error_cb(peer, false, NULL);
+   return err;
+   }
+
+   return 0;
+}
+
 int connman_peer_set_state(struct connman_peer *peer,
enum connman_peer_state new_state)
 {
@@ -697,19 +749,8 @@ int connman_peer_set_state(struct connman_peer *peer,
 
break;
case CONNMAN_PEER_STATE_FAILURE:
-   reply_pending(peer, ENOTCONN);
-
-   peer_disconnect(peer);
-
-   if (!peer-connection_master) {
-   __connman_dhcp_stop(peer-ipconfig);
-   __connman_ipconfig_disable(peer-ipconfig);
-   } else
-   stop_dhcp_server(peer);
-
-   peer-connection_master = false;
-   peer-sub_device = NULL;
-
+   if (manage_peer_error(peer) == 0)
+   return 0;
break;
};
 
@@ -852,6 +893,7 @@ void connman_peer_unregister(struct connman_peer *peer)
if (!peer-path || !peer-registered)
return;
 
+   connman_agent_cancel(peer);
reply_pending(peer, EIO);
 
g_dbus_unregister_interface(connection, peer-path,
-- 
1.8.5.5

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


[PATCH 07/16] peer: Manage peer connection properly through an Agent report

2014-08-01 Thread Tomasz Bursztyka
Thus the upper layer, if providing an agent, will get a report from
connman and it will be possible at this point to ask for a proper retry.
---
 src/peer.c | 66 +-
 1 file changed, 53 insertions(+), 13 deletions(-)

diff --git a/src/peer.c b/src/peer.c
index d41a63d..08fd8e7 100644
--- a/src/peer.c
+++ b/src/peer.c
@@ -27,6 +27,8 @@
 #include gdbus.h
 #include gdhcp/gdhcp.h
 
+#include connman/agent.h
+
 #include connman.h
 
 static DBusConnection *connection = NULL;
@@ -655,6 +657,55 @@ static int start_dhcp_client(struct connman_peer *peer)
return __connman_dhcp_start(peer-ipconfig, NULL, dhcp_callback, peer);
 }
 
+static void report_error_cb(void *user_context, bool retry, void *user_data)
+{
+   struct connman_peer *peer = user_context;
+
+   if (retry) {
+   int err;
+   err = peer_connect(peer);
+
+   if (err == 0 || err == -EINPROGRESS)
+   return;
+   }
+
+   reply_pending(peer, ENOTCONN);
+
+   peer_disconnect(peer);
+
+   if (!peer-connection_master) {
+   __connman_dhcp_stop(peer-ipconfig);
+   __connman_ipconfig_disable(peer-ipconfig);
+   } else
+   stop_dhcp_server(peer);
+
+   peer-connection_master = false;
+   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;
+
+   err = __connman_agent_report_peer_error(peer, peer-path,
+   connect-failed, report_error_cb,
+   get_dbus_sender(peer), NULL);
+   if (err != -EINPROGRESS) {
+   report_error_cb(peer, false, NULL);
+   return err;
+   }
+
+   return 0;
+}
+
 int connman_peer_set_state(struct connman_peer *peer,
enum connman_peer_state new_state)
 {
@@ -692,19 +743,8 @@ int connman_peer_set_state(struct connman_peer *peer,
 
break;
case CONNMAN_PEER_STATE_FAILURE:
-   reply_pending(peer, ENOTCONN);
-
-   peer_disconnect(peer);
-
-   if (!peer-connection_master) {
-   __connman_dhcp_stop(peer-ipconfig);
-   __connman_ipconfig_disable(peer-ipconfig);
-   } else
-   stop_dhcp_server(peer);
-
-   peer-connection_master = false;
-   peer-sub_device = NULL;
-
+   if (manage_peer_error(peer) == 0)
+   return 0;
break;
};
 
-- 
1.8.5.5

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