summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Xu <martin.xu@intel.com>2010-01-28 22:38:46 +0800
committerMarcel Holtmann <marcel@holtmann.org>2010-01-29 08:12:52 +0100
commit27c7fd4ec4582769b1164be1daaf56e8f070f0f5 (patch)
tree52e206500fe0c92f43661f43760ef7e5d4be3a9b
parent1e3def632f54af8437080f8fe6db7f1d833f606d (diff)
downloadconnman-27c7fd4ec4582769b1164be1daaf56e8f070f0f5.tar.gz
connman-27c7fd4ec4582769b1164be1daaf56e8f070f0f5.tar.bz2
connman-27c7fd4ec4582769b1164be1daaf56e8f070f0f5.zip
Add network->driver->setup() callback function
After string value has been set in function connman_network_set_string() call network->driver->setup() to let network driver handle the value. ofono network driver setup call back function handles "Cellular.APN" to set up APN.
-rw-r--r--include/network.h1
-rw-r--r--plugins/ofono.c13
-rw-r--r--src/network.c14
3 files changed, 25 insertions, 3 deletions
diff --git a/include/network.h b/include/network.h
index 6ab109da..e0b1cc39 100644
--- a/include/network.h
+++ b/include/network.h
@@ -141,6 +141,7 @@ struct connman_network_driver {
void (*remove) (struct connman_network *network);
int (*connect) (struct connman_network *network);
int (*disconnect) (struct connman_network *network);
+ int (*setup) (struct connman_network *network, const char *key);
};
int connman_network_driver_register(struct connman_network_driver *driver);
diff --git a/plugins/ofono.c b/plugins/ofono.c
index 571b9749..e454ddee 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -570,8 +570,6 @@ static int network_connect(struct connman_network *network)
if (connman_network_get_index(network) >= 0)
return -EISCONN;
- set_apn(network);
-
return set_network_active(network, TRUE);
}
@@ -588,6 +586,16 @@ static void network_remove(struct connman_network *network)
DBG("network %p", network);
}
+static int network_setup(struct connman_network *network, const char *key)
+{
+ DBG("");
+
+ if (g_strcmp0(key, "Cellular.APN") == 0)
+ set_apn(network);
+
+ return 0;
+}
+
static struct connman_network_driver network_driver = {
.name = "network",
.type = CONNMAN_NETWORK_TYPE_CELLULAR,
@@ -595,6 +603,7 @@ static struct connman_network_driver network_driver = {
.remove = network_remove,
.connect = network_connect,
.disconnect = network_disconnect,
+ .setup = network_setup,
};
static void add_network(struct connman_device *device, const char *path)
diff --git a/src/network.c b/src/network.c
index c233c8f5..5698809b 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1017,6 +1017,8 @@ int connman_network_set_roaming(struct connman_network *network,
int connman_network_set_string(struct connman_network *network,
const char *key, const char *value)
{
+ int err;
+
DBG("network %p key %s value %s", network, key, value);
if (g_strcmp0(key, "Name") == 0)
@@ -1060,7 +1062,17 @@ int connman_network_set_string(struct connman_network *network,
network->wifi.phase2_auth = g_strdup(value);
}
- return connman_element_set_string(&network->element, key, value);
+ err = connman_element_set_string(&network->element, key, value);
+ if (err < 0)
+ return err;
+
+ if (network->driver == NULL)
+ return 0;
+
+ if (network->driver->setup)
+ return network->driver->setup(network, key);
+
+ return 0;
}
/**