summaryrefslogtreecommitdiff
path: root/src/service.c
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2010-07-30 16:08:44 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2010-08-02 19:16:11 +0200
commitd885703619a775d053e0170eb2acb080fa205841 (patch)
tree21a6ad89488e289e2c5fb7a0bfdeaa9998091c06 /src/service.c
parentde41f828cf9decef412165c2895cb6ddc73be455 (diff)
downloadconnman-d885703619a775d053e0170eb2acb080fa205841.tar.gz
connman-d885703619a775d053e0170eb2acb080fa205841.tar.bz2
connman-d885703619a775d053e0170eb2acb080fa205841.zip
Link providers with services
With each provider we now have a VPN type service.
Diffstat (limited to 'src/service.c')
-rw-r--r--src/service.c65
1 files changed, 64 insertions, 1 deletions
diff --git a/src/service.c b/src/service.c
index 2ddda9fd..4ad14326 100644
--- a/src/service.c
+++ b/src/service.c
@@ -90,6 +90,7 @@ struct connman_service {
connman_bool_t login_required;
struct connman_ipconfig *ipconfig;
struct connman_network *network;
+ struct connman_provider *provider;
char **nameservers;
char *nameserver;
char **domains;
@@ -3275,7 +3276,7 @@ static void update_from_network(struct connman_service *service,
*
* Look up service by network and if not found, create one
*/
-struct connman_service *__connman_service_create_from_network(struct connman_network *network)
+struct connman_service * __connman_service_create_from_network(struct connman_network *network)
{
struct connman_service *service;
const char *ident, *group;
@@ -3416,6 +3417,68 @@ void __connman_service_remove_from_network(struct connman_network *network)
__connman_service_put(service);
}
+/**
+ * __connman_service_create_from_provider:
+ * @provider: provider structure
+ *
+ * Look up service by provider and if not found, create one
+ */
+struct connman_service *
+__connman_service_create_from_provider(struct connman_provider *provider)
+{
+ struct connman_service *service;
+ const char *ident, *str;
+ char *name;
+ int index = connman_provider_get_index(provider);
+
+ DBG("provider %p", provider);
+
+ ident = __connman_provider_get_ident(provider);
+ if (ident == NULL)
+ return NULL;
+
+ name = g_strdup_printf("vpn_%s", ident);
+ service = __connman_service_get(name);
+ g_free(name);
+
+ if (service == NULL)
+ return NULL;
+
+ service->type = CONNMAN_SERVICE_TYPE_VPN;
+ service->provider = provider;
+ service->autoconnect = FALSE;
+
+ service->state = CONNMAN_SERVICE_STATE_IDLE;
+
+ str = connman_provider_get_string(provider, "Name");
+ if (str != NULL) {
+ g_free(service->name);
+ service->name = g_strdup(str);
+ service->hidden = FALSE;
+ } else {
+ g_free(service->name);
+ service->name = NULL;
+ service->hidden = TRUE;
+ }
+
+ service->strength = 0;
+
+ service->ipconfig = connman_ipconfig_create(index);
+ if (service->ipconfig == NULL)
+ return service;
+
+ connman_ipconfig_set_method(service->ipconfig,
+ CONNMAN_IPCONFIG_METHOD_MANUAL);
+
+ connman_ipconfig_set_data(service->ipconfig, service);
+
+ connman_ipconfig_set_ops(service->ipconfig, &service_ops);
+
+ service_register(service);
+
+ return service;
+}
+
void __connman_service_stats_update(struct connman_service *service,
unsigned int rx_packets, unsigned int tx_packets,
unsigned int rx_bytes, unsigned int tx_bytes,