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