From: Daniel Wagner <daniel.wag...@bmw-carit.de>

The caller indicates by providing a connect reason 'who' initiated
the connection.

For this we remove the userconnect bool from struct
connman_service and set the __connect_service_connect()
and __connman_service_disconnect().
---
 src/config.c  |  6 +++--
 src/connman.h | 12 +++++++---
 src/network.c |  4 ++--
 src/service.c | 72 +++++++++++++++++++++++++++++++++++++----------------------
 4 files changed, 60 insertions(+), 34 deletions(-)

diff --git a/src/config.c b/src/config.c
index 19d8b92..feee6b2 100644
--- a/src/config.c
+++ b/src/config.c
@@ -1044,7 +1044,8 @@ static gboolean remove_virtual_config(gpointer user_data)
 {
        struct connect_virtual *virtual = user_data;
 
-       __connman_service_connect(virtual->service);
+       __connman_service_connect(virtual->service,
+                               CONNMAN_SERVICE_CONNECT_REASON_AUTO);
        g_hash_table_remove(config_table, virtual->vfile);
 
        g_free(virtual);
@@ -1241,7 +1242,8 @@ static void provision_service(gpointer key, gpointer 
value,
                provision_service_wifi(key, config, service, network,
                                                        ssid, ssid_len);
        } else
-               __connman_service_connect(service);
+               __connman_service_connect(service,
+                                       CONNMAN_SERVICE_CONNECT_REASON_AUTO);
 
        __connman_service_mark_dirty();
 
diff --git a/src/connman.h b/src/connman.h
index bf209cc..80afab3 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -672,8 +672,6 @@ int __connman_service_set_immutable(struct connman_service 
*service,
                                                bool immutable);
 int __connman_service_set_ignore(struct connman_service *service,
                                                bool ignore);
-void __connman_service_set_userconnect(struct connman_service *service,
-                                               bool userconnect);
 void __connman_service_set_search_domains(struct connman_service *service,
                                        char **domains);
 void __connman_service_update_search_domains(struct connman_service *service,
@@ -695,7 +693,15 @@ int __connman_service_indicate_error(struct 
connman_service *service,
 int __connman_service_clear_error(struct connman_service *service);
 int __connman_service_indicate_default(struct connman_service *service);
 
-int __connman_service_connect(struct connman_service *service);
+enum connman_service_connect_reason {
+       CONNMAN_SERVICE_CONNECT_REASON_NONE     = 0,
+       CONNMAN_SERVICE_CONNECT_REASON_AUTO     = 1,
+       CONNMAN_SERVICE_CONNECT_REASON_USER     = 2,
+       CONNMAN_SERVICE_CONNECT_REASON_SESSION  = 3,
+};
+
+int __connman_service_connect(struct connman_service *service,
+                       enum connman_service_connect_reason reason);
 int __connman_service_disconnect(struct connman_service *service);
 int __connman_service_disconnect_all(void);
 void __connman_service_set_active_session(bool enable, GSList *list);
diff --git a/src/network.c b/src/network.c
index 36366f4..d7b5d0c 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1469,9 +1469,9 @@ int connman_network_connect_hidden(struct connman_network 
*network,
                goto out;
        } else {
                __connman_service_set_hidden(service);
-               __connman_service_set_userconnect(service, true);
                __connman_service_set_hidden_data(service, user_data);
-               return __connman_service_connect(service);
+               return __connman_service_connect(service,
+                                       CONNMAN_SERVICE_CONNECT_REASON_USER);
        }
 
 out:
diff --git a/src/service.c b/src/service.c
index 4bc70c0..63054b7 100644
--- a/src/service.c
+++ b/src/service.c
@@ -73,13 +73,13 @@ struct connman_service {
        enum connman_service_state state_ipv4;
        enum connman_service_state state_ipv6;
        enum connman_service_error error;
+       enum connman_service_connect_reason connect_reason;
        uint8_t strength;
        bool favorite;
        bool immutable;
        bool hidden;
        bool ignore;
        bool autoconnect;
-       bool userconnect;
        GTimeVal modified;
        unsigned int order;
        char *name;
@@ -162,6 +162,23 @@ static struct connman_service *find_service(const char 
*path)
        return data.service;
 }
 
+static const char *reason2string(enum connman_service_connect_reason reason)
+{
+
+       switch (reason) {
+       case CONNMAN_SERVICE_CONNECT_REASON_NONE:
+               return "none";
+       case CONNMAN_SERVICE_CONNECT_REASON_USER:
+               return "user";
+       case CONNMAN_SERVICE_CONNECT_REASON_AUTO:
+               return "auto";
+       case CONNMAN_SERVICE_CONNECT_REASON_SESSION:
+               return "session";
+       }
+
+       return "unknown";
+}
+
 const char *__connman_service_type2string(enum connman_service_type type)
 {
        switch (type) {
@@ -3534,7 +3551,8 @@ static GList *preferred_tech_list_get(void)
                        if (!is_connected(service))
                                break;
 
-                       if (service->userconnect) {
+                       if (service->connect_reason ==
+                                       CONNMAN_SERVICE_CONNECT_REASON_USER) {
                                DBG("service %p name %s is user connected",
                                                service, service->name);
                                return NULL;
@@ -3606,8 +3624,8 @@ static bool auto_connect_service(GList *services, bool 
preferred)
                DBG("service %p %s %s", service, service->name,
                                (preferred) ? "preferred" : "auto");
 
-               service->userconnect = false;
-               __connman_service_connect(service);
+               __connman_service_connect(service,
+                               CONNMAN_SERVICE_CONNECT_REASON_AUTO);
 
                if (!active_count)
                        return true;
@@ -3680,7 +3698,8 @@ static gboolean run_vpn_auto_connect(gpointer data) {
                                service->do_split_routing ?
                                "split routing" : "");
 
-               res = __connman_service_connect(service);
+               res = __connman_service_connect(service,
+                               CONNMAN_SERVICE_CONNECT_REASON_AUTO);
                if (res < 0 && res != -EINPROGRESS)
                        continue;
 
@@ -3855,7 +3874,9 @@ static gboolean connect_timeout(gpointer user_data)
                                        CONNMAN_SERVICE_STATE_FAILURE,
                                        CONNMAN_IPCONFIG_TYPE_IPV6);
 
-       if (autoconnect && !service->userconnect)
+       if (autoconnect &&
+                       service->connect_reason !=
+                               CONNMAN_SERVICE_CONNECT_REASON_USER)
                __connman_service_auto_connect();
 
        return FALSE;
@@ -3920,11 +3941,10 @@ static DBusMessage *connect_service(DBusConnection 
*conn,
 
        service->ignore = false;
 
-       service->userconnect = true;
-
        service->pending = dbus_message_ref(msg);
 
-       err = __connman_service_connect(service);
+       err = __connman_service_connect(service,
+                       CONNMAN_SERVICE_CONNECT_REASON_USER);
        if (err < 0) {
                if (!service->pending)
                        return NULL;
@@ -4486,7 +4506,7 @@ static void service_initialize(struct connman_service 
*service)
 
        service->ignore = false;
 
-       service->userconnect = false;
+       service->connect_reason = CONNMAN_SERVICE_CONNECT_REASON_NONE;
 
        service->order = 0;
 
@@ -4923,13 +4943,6 @@ void __connman_service_set_string(struct connman_service 
*service,
        }
 }
 
-void __connman_service_set_userconnect(struct connman_service *service,
-                                               bool userconnect)
-{
-       if (service)
-               service->userconnect = userconnect;
-}
-
 void __connman_service_set_search_domains(struct connman_service *service,
                                        char **domains)
 {
@@ -4965,7 +4978,7 @@ static void service_complete(struct connman_service 
*service)
 {
        reply_pending(service, EIO);
 
-       if (!service->userconnect)
+       if (service->connect_reason != CONNMAN_SERVICE_CONNECT_REASON_USER)
                __connman_service_auto_connect();
 
        g_get_current_time(&service->modified);
@@ -4978,7 +4991,8 @@ static void report_error_cb(void *user_context, bool 
retry,
        struct connman_service *service = user_context;
 
        if (retry)
-               __connman_service_connect(service);
+               __connman_service_connect(service,
+                                       CONNMAN_SERVICE_CONNECT_REASON_USER);
        else {
                /* It is not relevant to stay on Failure state
                 * when failing is due to wrong user input */
@@ -5114,7 +5128,8 @@ static void request_input_cb(struct connman_service 
*service,
                /* We forget any previous error. */
                set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
 
-               __connman_service_connect(service);
+               __connman_service_connect(service,
+                                       CONNMAN_SERVICE_CONNECT_REASON_USER);
 
        } else if (err == -ENOKEY) {
                __connman_service_indicate_error(service,
@@ -5375,7 +5390,7 @@ static int service_indicate_state(struct connman_service 
*service)
 
        if (new_state == CONNMAN_SERVICE_STATE_FAILURE) {
 
-               if (service->userconnect &&
+               if (service->connect_reason == 
CONNMAN_SERVICE_CONNECT_REASON_USER &&
                        connman_agent_report_error(service, service->path,
                                        error2string(service->error),
                                        report_error_cb,
@@ -5893,12 +5908,15 @@ static int service_connect(struct connman_service 
*service)
        return err;
 }
 
-
-int __connman_service_connect(struct connman_service *service)
+int __connman_service_connect(struct connman_service *service,
+                       enum connman_service_connect_reason reason)
 {
        int err;
 
-       DBG("service %p state %s", service, state2string(service->state));
+       DBG("service %p state %s connect reason %s -> %s",
+               service, state2string(service->state),
+               reason2string(service->connect_reason),
+               reason2string(reason));
 
        if (is_connected(service))
                return -EISCONN;
@@ -5919,6 +5937,7 @@ int __connman_service_connect(struct connman_service 
*service)
                err = service_connect(service);
        }
 
+       service->connect_reason = reason;
        if (err >= 0) {
                set_error(service, CONNMAN_SERVICE_ERROR_UNKNOWN);
                return 0;
@@ -5938,7 +5957,7 @@ int __connman_service_connect(struct connman_service 
*service)
                                service->provider)
                        connman_provider_disconnect(service->provider);
 
-       if (service->userconnect) {
+       if (service->connect_reason == CONNMAN_SERVICE_CONNECT_REASON_USER) {
                if (err == -ENOKEY || err == -EPERM) {
                        DBusMessage *pending = NULL;
 
@@ -5974,7 +5993,7 @@ int __connman_service_disconnect(struct connman_service 
*service)
 
        DBG("service %p", service);
 
-       service->userconnect = false;
+       service->connect_reason = CONNMAN_SERVICE_CONNECT_REASON_NONE;
        service->proxy = CONNMAN_SERVICE_PROXY_METHOD_UNKNOWN;
 
        connman_agent_cancel(service);
@@ -6819,7 +6838,6 @@ __connman_service_create_from_provider(struct 
connman_provider *provider)
        service->type = CONNMAN_SERVICE_TYPE_VPN;
        service->provider = connman_provider_ref(provider);
        service->autoconnect = false;
-       service->userconnect = true;
        service->favorite = true;
 
        service->state_ipv4 = service->state_ipv6 = CONNMAN_SERVICE_STATE_IDLE;
-- 
1.8.5.3

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

Reply via email to