Send connman mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
https://lists.01.org/mailman/listinfo/connman
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of connman digest..."
Today's Topics:
1. [PATCH 07/10] include: Add connman_service_get_identifier()
prototype (Slava Monich)
2. [PATCH 08/10] service: Expose service identifier to plugins
(Slava Monich)
3. [PATCH 09/10] service: Remove
__connman_service_lookup_from_ident() (Slava Monich)
4. [PATCH 10/10] vpn: Disconnect VPN provider when transport is
gone (Slava Monich)
----------------------------------------------------------------------
Message: 1
Date: Mon, 17 Sep 2018 19:48:38 +0300
From: Slava Monich <[email protected]>
To: [email protected]
Subject: [PATCH 07/10] include: Add connman_service_get_identifier()
prototype
Message-ID: <[email protected]>
---
include/service.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/include/service.h b/include/service.h
index 443099e..97fdf7d 100644
--- a/include/service.h
+++ b/include/service.h
@@ -117,6 +117,7 @@ enum connman_service_type connman_service_get_type(struct
connman_service *servi
enum connman_service_state connman_service_get_state(struct connman_service
*service);
char *connman_service_get_interface(struct connman_service *service);
+const char *connman_service_get_identifier(struct connman_service *service);
const char *connman_service_get_domainname(struct connman_service *service);
const char *connman_service_get_dbuspath(struct connman_service *service);
char **connman_service_get_nameservers(struct connman_service *service);
--
1.9.1
------------------------------
Message: 2
Date: Mon, 17 Sep 2018 19:48:39 +0300
From: Slava Monich <[email protected]>
To: [email protected]
Subject: [PATCH 08/10] service: Expose service identifier to plugins
Message-ID: <[email protected]>
Public connman_service_get_identifier() can be called by plugins
and replaces internal __connman_service_get_ident().
---
src/config.c | 4 ++--
src/connman.h | 1 -
src/dhcpv6.c | 2 +-
src/provider.c | 2 +-
src/service.c | 4 ++--
src/stats.c | 6 +++---
6 files changed, 9 insertions(+), 10 deletions(-)
diff --git a/src/config.c b/src/config.c
index 07ae64e..8dca9fe 100644
--- a/src/config.c
+++ b/src/config.c
@@ -1253,7 +1253,7 @@ static int try_provision_service(struct
connman_config_service *config,
}
DBG("service %p ident %s", service,
- __connman_service_get_ident(service));
+ connman_service_get_identifier(service));
if (config->mac) {
struct connman_device *device;
@@ -1356,7 +1356,7 @@ static int try_provision_service(struct
connman_config_service *config,
__connman_service_disconnect(service);
- service_id = __connman_service_get_ident(service);
+ service_id = connman_service_get_identifier(service);
config->service_identifiers =
g_slist_prepend(config->service_identifiers,
g_strdup(service_id));
diff --git a/src/connman.h b/src/connman.h
index 2782269..24f8f72 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -696,7 +696,6 @@ void __connman_service_wispr_start(struct connman_service
*service,
enum connman_ipconfig_type type);
bool __connman_service_is_connected_state(struct connman_service *service,
enum connman_ipconfig_type type);
-const char *__connman_service_get_ident(struct connman_service *service);
const char *__connman_service_get_path(struct connman_service *service);
const char *__connman_service_get_name(struct connman_service *service);
struct connman_network *__connman_service_get_network(struct connman_service
*service);
diff --git a/src/dhcpv6.c b/src/dhcpv6.c
index cbf7974..2d5f8f6 100644
--- a/src/dhcpv6.c
+++ b/src/dhcpv6.c
@@ -196,7 +196,7 @@ static int set_duid(struct connman_service *service,
unsigned char *duid;
int duid_len;
- ident = __connman_service_get_ident(service);
+ ident = connman_service_get_identifier(service);
keyfile = connman_storage_load_service(ident);
if (!keyfile)
diff --git a/src/provider.c b/src/provider.c
index 892d0fb..5f57ba9 100644
--- a/src/provider.c
+++ b/src/provider.c
@@ -732,7 +732,7 @@ static void provider_service_changed(struct connman_service
*service,
vpn_index = __connman_connection_get_vpn_index(service_index);
DBG("service %p %s state %d index %d/%d", service,
- __connman_service_get_ident(service),
+ connman_service_get_identifier(service),
state, service_index, vpn_index);
if (vpn_index < 0)
diff --git a/src/service.c b/src/service.c
index fdb0a52..adbb152 100644
--- a/src/service.c
+++ b/src/service.c
@@ -6956,9 +6956,9 @@ struct connman_service
*__connman_service_lookup_from_ident(const char *identifi
return lookup_by_identifier(identifier);
}
-const char *__connman_service_get_ident(struct connman_service *service)
+const char *connman_service_get_identifier(struct connman_service *service)
{
- return service->identifier;
+ return service ? service->identifier : NULL;
}
const char *__connman_service_get_path(struct connman_service *service)
diff --git a/src/stats.c b/src/stats.c
index 663bc38..b9205a9 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -678,7 +678,7 @@ int __connman_stats_service_register(struct connman_service
*service)
DBG("service %p", service);
dir = g_strdup_printf("%s/%s", STORAGEDIR,
- __connman_service_get_ident(service));
+ connman_service_get_identifier(service));
/* If the dir doesn't exist, create it */
if (!g_file_test(dir, G_FILE_TEST_IS_DIR)) {
@@ -707,9 +707,9 @@ int __connman_stats_service_register(struct connman_service
*service)
}
name = g_strdup_printf("%s/%s/data", STORAGEDIR,
- __connman_service_get_ident(service));
+ connman_service_get_identifier(service));
file->history_name = g_strdup_printf("%s/%s/history", STORAGEDIR,
- __connman_service_get_ident(service));
+ connman_service_get_identifier(service));
/* TODO: Use a global config file instead of hard coded value. */
file->account_period_offset = 1;
--
1.9.1
------------------------------
Message: 3
Date: Mon, 17 Sep 2018 19:48:40 +0300
From: Slava Monich <[email protected]>
To: [email protected]
Subject: [PATCH 09/10] service: Remove
__connman_service_lookup_from_ident()
Message-ID:
<[email protected]>
It was a duplicate of connman_service_lookup_from_identifier()
---
src/config.c | 2 +-
src/connman.h | 1 -
src/service.c | 7 +------
3 files changed, 2 insertions(+), 8 deletions(-)
diff --git a/src/config.c b/src/config.c
index 8dca9fe..af4f07e 100644
--- a/src/config.c
+++ b/src/config.c
@@ -196,7 +196,7 @@ static void unregister_service(gpointer data)
list = list->next) {
service_id = list->data;
- service = __connman_service_lookup_from_ident(service_id);
+ service = connman_service_lookup_from_identifier(service_id);
if (service) {
__connman_service_set_immutable(service, false);
__connman_service_set_config(service, NULL, NULL);
diff --git a/src/connman.h b/src/connman.h
index 24f8f72..1355383 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -675,7 +675,6 @@ int __connman_service_compare(const struct connman_service
*a,
const struct connman_service *b);
struct connman_service *__connman_service_lookup_from_index(int index);
-struct connman_service *__connman_service_lookup_from_ident(const char
*identifier);
struct connman_service *__connman_service_create_from_network(struct
connman_network *network);
struct connman_service *__connman_service_create_from_provider(struct
connman_provider *provider);
bool __connman_service_index_is_default(int index);
diff --git a/src/service.c b/src/service.c
index adbb152..f0234a6 100644
--- a/src/service.c
+++ b/src/service.c
@@ -6571,7 +6571,7 @@ static struct connman_service *lookup_by_identifier(const
char *identifier)
struct connman_service *connman_service_lookup_from_identifier(const char*
identifier)
{
- return lookup_by_identifier(identifier);
+ return identifier ? lookup_by_identifier(identifier) : NULL;
}
struct provision_user_data {
@@ -6951,11 +6951,6 @@ struct connman_service
*__connman_service_lookup_from_index(int index)
return NULL;
}
-struct connman_service *__connman_service_lookup_from_ident(const char
*identifier)
-{
- return lookup_by_identifier(identifier);
-}
-
const char *connman_service_get_identifier(struct connman_service *service)
{
return service ? service->identifier : NULL;
--
1.9.1
------------------------------
Message: 4
Date: Mon, 17 Sep 2018 19:48:41 +0300
From: Slava Monich <[email protected]>
To: [email protected]
Subject: [PATCH 10/10] vpn: Disconnect VPN provider when transport is
gone
Message-ID:
<[email protected]>
We record identifier of the default service when VPN connection
is getting established and tell provider to disconnect when that
service is disconnected or is no longer the default.
This helps to re-establish VPN connection after switching between
WiFi and mobile data.
---
plugins/vpn.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 125 insertions(+), 4 deletions(-)
diff --git a/plugins/vpn.c b/plugins/vpn.c
index b888e5e..964b686 100644
--- a/plugins/vpn.c
+++ b/plugins/vpn.c
@@ -38,6 +38,7 @@
#include <connman/dbus.h>
#include <connman/provider.h>
#include <connman/ipaddress.h>
+#include <connman/notifier.h>
#include <connman/vpn-dbus.h>
#include <connman/inet.h>
#include <gweb/gresolv.h>
@@ -73,6 +74,7 @@ struct connection_data {
DBusPendingCall *call;
bool connect_pending;
struct config_create_data *cb_data;
+ char *service_ident;
char *state;
char *type;
@@ -249,6 +251,12 @@ static void free_config_cb_data(struct config_create_data
*cb_data)
g_free(cb_data);
}
+static bool provider_is_connected(struct connection_data *data)
+{
+ return data && (g_str_equal(data->state, "ready") ||
+ g_str_equal(data->state, "configuration"));
+}
+
static void set_provider_state(struct connection_data *data)
{
enum connman_provider_state state = CONNMAN_PROVIDER_STATE_UNKNOWN;
@@ -256,6 +264,11 @@ static void set_provider_state(struct connection_data
*data)
DBG("provider %p new state %s", data->provider, data->state);
+ if (!provider_is_connected(data)) {
+ g_free(data->service_ident);
+ data->service_ident = NULL;
+ }
+
if (g_str_equal(data->state, "ready")) {
state = CONNMAN_PROVIDER_STATE_READY;
goto set;
@@ -517,6 +530,7 @@ static int connect_provider(struct connection_data *data,
void *user_data,
DBusPendingCall *call;
DBusMessage *message;
struct config_create_data *cb_data = user_data;
+ struct connman_service *transport = connman_service_get_default();
DBG("data %p user %p path %s sender %s", data, cb_data, data->path,
dbus_sender);
@@ -558,6 +572,19 @@ static int connect_provider(struct connection_data *data,
void *user_data,
cb_data->path = g_strdup(data->path);
}
+ if (transport) {
+ /* This is the service which (most likely) will be used
+ * as a transport for VPN connection */
+ g_free(data->service_ident);
+ data->service_ident =
+ g_strdup(connman_service_get_identifier(transport));
+ DBG("transport %s", data->service_ident);
+ } else {
+ DBG("no transport????");
+ g_free(data->service_ident);
+ data->service_ident = NULL;
+ }
+
dbus_pending_call_set_notify(call, connect_reply, data, NULL);
dbus_message_unref(message);
@@ -944,6 +971,9 @@ static int disconnect_provider(struct connection_data *data)
dbus_message_unref(message);
+ g_free(data->service_ident);
+ data->service_ident = NULL;
+
connman_provider_set_state(data->provider,
CONNMAN_PROVIDER_STATE_DISCONNECT);
/*
@@ -966,8 +996,7 @@ static int provider_disconnect(struct connman_provider
*provider)
if (!data)
return -EINVAL;
- if (g_str_equal(data->state, "ready") ||
- g_str_equal(data->state, "configuration"))
+ if (provider_is_connected(data))
return disconnect_provider(data);
return 0;
@@ -1475,8 +1504,7 @@ static void destroy_provider(struct connection_data *data)
{
DBG("data %p", data);
- if (g_str_equal(data->state, "ready") ||
- g_str_equal(data->state, "configuration"))
+ if (provider_is_connected(data))
connman_provider_disconnect(data->provider);
if (data->call)
@@ -1498,6 +1526,7 @@ static void connection_destroy(gpointer hash_data)
if (data->provider)
destroy_provider(data);
+ g_free(data->service_ident);
g_free(data->path);
g_free(data->ident);
g_free(data->state);
@@ -1812,6 +1841,96 @@ static gboolean property_changed(DBusConnection *conn,
return TRUE;
}
+static int vpn_find_online_transport_cb(struct connman_service *service,
+ void *user_data)
+{
+ if (connman_service_get_type(service) != CONNMAN_SERVICE_TYPE_VPN) {
+ switch (connman_service_get_state(service)) {
+ case CONNMAN_SERVICE_STATE_ONLINE:
+ *((struct connman_service**)user_data) = service;
+ return 1;
+ default:
+ break;
+ }
+ }
+
+ return 0;
+}
+
+static struct connman_service *vpn_find_online_transport()
+{
+ struct connman_service *service = NULL;
+
+ connman_service_iterate_services(vpn_find_online_transport_cb,
+ &service);
+ return service;
+}
+
+static bool vpn_is_valid_transport(struct connman_service *transport)
+{
+ if (transport) {
+ switch (connman_service_get_state(transport)) {
+ case CONNMAN_SERVICE_STATE_READY:
+ return vpn_find_online_transport() == NULL;
+ case CONNMAN_SERVICE_STATE_ONLINE:
+ return vpn_find_online_transport() == transport;
+ default:
+ break;
+ }
+ }
+ return false;
+}
+
+static void vpn_disconnect_check_provider(struct connection_data *data)
+{
+ if (data->service_ident && provider_is_connected(data)) {
+ struct connman_service *service =
+ connman_service_lookup_from_identifier
+ (data->service_ident);
+
+ if (!vpn_is_valid_transport(service)) {
+ DBG("transport gone");
+ disconnect_provider(data);
+ }
+ }
+}
+
+static void vpn_disconnect_check()
+{
+ GHashTableIter iter;
+ gpointer value;
+
+ DBG("");
+ g_hash_table_iter_init(&iter, vpn_connections);
+ while (g_hash_table_iter_next(&iter, NULL, &value))
+ vpn_disconnect_check_provider(value);
+}
+
+static void vpn_service_add(struct connman_service *service, const char *name)
+{
+ vpn_disconnect_check();
+}
+
+static void vpn_service_list_changed(struct connman_service *service)
+{
+ vpn_disconnect_check();
+}
+
+static void vpn_service_state_changed(struct connman_service *service,
+ enum connman_service_state state)
+{
+ vpn_disconnect_check();
+}
+
+static struct connman_notifier vpn_notifier = {
+ .name = "vpn",
+ .priority = CONNMAN_NOTIFIER_PRIORITY_DEFAULT,
+ .default_changed = vpn_service_list_changed,
+ .service_add = vpn_service_add,
+ .service_remove = vpn_service_list_changed,
+ .service_state_changed = vpn_service_state_changed
+};
+
static int vpn_init(void)
{
int err;
@@ -1852,6 +1971,7 @@ static int vpn_init(void)
vpnd_created(connection, &provider_driver);
}
+ connman_notifier_register(&vpn_notifier);
return err;
remove:
@@ -1872,6 +1992,7 @@ static void vpn_exit(void)
g_dbus_remove_watch(connection, removed_watch);
g_dbus_remove_watch(connection, property_watch);
+ connman_notifier_unregister(&vpn_notifier);
connman_provider_driver_unregister(&provider_driver);
if (vpn_connections)
--
1.9.1
------------------------------
Subject: Digest Footer
_______________________________________________
connman mailing list
[email protected]
https://lists.01.org/mailman/listinfo/connman
------------------------------
End of connman Digest, Vol 35, Issue 5
**************************************