summaryrefslogtreecommitdiff
path: root/src/network.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/network.c')
-rw-r--r--src/network.c75
1 files changed, 74 insertions, 1 deletions
diff --git a/src/network.c b/src/network.c
index c36298e6..a74043c7 100644
--- a/src/network.c
+++ b/src/network.c
@@ -845,6 +845,31 @@ static int set_connected_dhcp(struct connman_network *network)
return 0;
}
+static int manual_ipv6_set(struct connman_network *network,
+ struct connman_ipconfig *ipconfig_ipv6)
+{
+ struct connman_service *service;
+ int err;
+
+ service = __connman_service_lookup_from_network(network);
+ if (service == NULL)
+ return -EINVAL;
+
+ err = __connman_ipconfig_set_address(ipconfig_ipv6);
+ if (err < 0) {
+ connman_network_set_error(network,
+ CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
+ return err;
+ }
+
+ /*
+ * READY state will be indicated by IPV4 setting
+ * gateway will be set by IPV4 setting
+ */
+
+ return 0;
+}
+
static gboolean set_connected(gpointer user_data)
{
struct connman_network *network = user_data;
@@ -861,6 +886,29 @@ static gboolean set_connected(gpointer user_data)
DBG("method %d", method);
if (network->connected == TRUE) {
+ enum connman_ipconfig_method ipv6_method;
+ struct connman_ipconfig *ipv6config;
+ int ret;
+
+ ipv6config = connman_ipconfig_get_ipv6config(ipconfig);
+ ipv6_method = __connman_ipconfig_get_method(ipv6config);
+ switch (ipv6_method) {
+ case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
+ case CONNMAN_IPCONFIG_METHOD_OFF:
+ break;
+ case CONNMAN_IPCONFIG_METHOD_FIXED:
+ case CONNMAN_IPCONFIG_METHOD_MANUAL:
+ ret = manual_ipv6_set(network, ipv6config);
+ if (ret != 0) {
+ connman_network_set_error(network,
+ CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
+ return FALSE;
+ }
+ break;
+ case CONNMAN_IPCONFIG_METHOD_DHCP:
+ break;
+ }
+
switch (method) {
case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
case CONNMAN_IPCONFIG_METHOD_OFF:
@@ -974,6 +1022,7 @@ connman_bool_t connman_network_get_associating(struct connman_network *network)
*/
int __connman_network_connect(struct connman_network *network)
{
+ struct connman_service *service;
int err;
DBG("network %p", network);
@@ -994,6 +1043,8 @@ int __connman_network_connect(struct connman_network *network)
network->connecting = TRUE;
+ service = __connman_service_lookup_from_network(network);
+
err = network->driver->connect(network);
if (err < 0) {
if (err == -EINPROGRESS)
@@ -1141,9 +1192,31 @@ int __connman_network_clear_ipconfig(struct connman_network *network,
return 0;
}
-int __connman_network_set_ipconfig(struct connman_network *network, struct connman_ipconfig *ipconfig)
+int __connman_network_set_ipconfig(struct connman_network *network,
+ struct connman_ipconfig *ipconfig)
{
+ struct connman_ipconfig *ipv6config;
enum connman_ipconfig_method method;
+ int ret;
+
+ ipv6config = connman_ipconfig_get_ipv6config(ipconfig);
+ method = __connman_ipconfig_get_method(ipv6config);
+ switch (method) {
+ case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
+ case CONNMAN_IPCONFIG_METHOD_OFF:
+ break;
+ case CONNMAN_IPCONFIG_METHOD_FIXED:
+ case CONNMAN_IPCONFIG_METHOD_MANUAL:
+ ret = manual_ipv6_set(network, ipv6config);
+ if (ret != 0) {
+ connman_network_set_error(network,
+ CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
+ return FALSE;
+ }
+ break;
+ case CONNMAN_IPCONFIG_METHOD_DHCP:
+ break;
+ }
method = __connman_ipconfig_get_method(ipconfig);