Add static IP support
authorMartin Xu <martin.xu@intel.com>
Tue, 9 Feb 2010 09:29:53 +0000 (10:29 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 11 Feb 2010 04:30:41 +0000 (05:30 +0100)
The IP adress setting is now based on the selected ipconfig method. It is
set after a service reconnection though.

include/network.h
plugins/ofono.c
plugins/supplicant.c
src/network.c
src/service.c

index e0b1cc3..f53f24e 100644 (file)
@@ -57,6 +57,7 @@ enum connman_network_protocol {
 enum connman_network_error {
        CONNMAN_NETWORK_ERROR_UNKNOWN         = 0,
        CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL  = 1,
+       CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL  = 2,
 };
 
 struct connman_network;
index e454dde..c35f860 100644 (file)
@@ -1619,6 +1619,9 @@ static gboolean pri_context_changed(DBusConnection *connection,
                case CONNMAN_IPCONFIG_METHOD_MANUAL:
                        break;
                case CONNMAN_IPCONFIG_METHOD_FIXED:
+                       connman_network_set_method(pending_network,
+                                               CONNMAN_IPCONFIG_METHOD_FIXED);
+
                        if (static_network_set_connected(
                                        pending_network, parent, active) < 0)
                                set_network_active(pending_network, FALSE);
index 535f1d3..ea71dba 100644 (file)
@@ -1899,8 +1899,6 @@ static void state_change(struct supplicant_task *task, DBusMessage *msg)
                                                        bssid, bssid_len);
 
                /* carrier on */
-               connman_network_set_method(task->network,
-                               CONNMAN_IPCONFIG_METHOD_DHCP);
                connman_network_set_connected(task->network, TRUE);
                break;
 
index 5698809..b059b82 100644 (file)
@@ -445,6 +445,19 @@ const char *connman_network_get_path(struct connman_network *network)
  */
 void connman_network_set_index(struct connman_network *network, int index)
 {
+       if (network->element.index < 0) {
+               struct connman_service *service;
+
+               /*
+                * This is needed for plugins that havent set their ipconfig
+                * layer yet, due to not being able to get a network index
+                * prior to creating a service.
+                */
+               service = __connman_service_lookup_from_network(network);
+               if (service != NULL)
+                       __connman_service_create_ipconfig(service, index);
+       }
+
        network->element.index = index;
 }
 
@@ -652,10 +665,35 @@ static void set_associate_error(struct connman_network *network)
                                        CONNMAN_SERVICE_STATE_FAILURE);
 }
 
+static void set_configure_error(struct connman_network *network)
+{
+       struct connman_service *service;
+
+       network->connecting = FALSE;
+
+       service = __connman_service_lookup_from_network(network);
+
+       __connman_service_indicate_state(service,
+                                       CONNMAN_SERVICE_STATE_FAILURE);
+}
+
 void connman_network_set_method(struct connman_network *network,
                                        enum connman_ipconfig_method method)
 {
+       struct connman_service *service;
+       struct connman_ipconfig *ipconfig;
+
        network->element.ipv4.method = method;
+
+       service = __connman_service_lookup_from_network(network);
+       if (service == NULL)
+               return;
+
+       ipconfig = __connman_service_get_ipconfig(service);
+       if (ipconfig == NULL)
+               return;
+
+       connman_ipconfig_set_method(ipconfig, method);
 }
 
 void connman_network_set_error(struct connman_network *network,
@@ -671,6 +709,9 @@ void connman_network_set_error(struct connman_network *network,
        case CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL:
                set_associate_error(network);
                break;
+       case CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL:
+               set_configure_error(network);
+               break;
        }
 }
 
@@ -694,16 +735,28 @@ static void set_configuration(struct connman_network *network)
 static void set_connected_manual(struct connman_network *network)
 {
        struct connman_service *service;
+       struct connman_ipconfig *ipconfig;
+       int err;
 
        DBG("network %p", network);
 
+       service = __connman_service_lookup_from_network(network);
+
+       ipconfig = __connman_service_get_ipconfig(service);
+
        set_configuration(network);
 
+       err = __connman_ipconfig_set_address(ipconfig);
+       if (err < 0) {
+               connman_network_set_error(network,
+                       CONNMAN_NETWORK_ERROR_CONFIGURE_FAIL);
+               return;
+       }
+
        network->connecting = FALSE;
 
        connman_network_set_associating(network, FALSE);
 
-       service = __connman_service_lookup_from_network(network);
        __connman_service_indicate_state(service, CONNMAN_SERVICE_STATE_READY);
 }
 
@@ -738,11 +791,20 @@ static int set_connected_dhcp(struct connman_network *network)
 static gboolean set_connected(gpointer user_data)
 {
        struct connman_network *network = user_data;
+       struct connman_service *service;
+       struct connman_ipconfig *ipconfig;
+       enum connman_ipconfig_method method;
+
+       service = __connman_service_lookup_from_network(network);
+
+       ipconfig = __connman_service_get_ipconfig(service);
+
+       method = __connman_ipconfig_get_method(ipconfig);
 
-       DBG("network method %d", network->element.ipv4.method);
+       DBG("method %d", method);
 
        if (network->connected == TRUE) {
-               switch (network->element.ipv4.method) {
+               switch (method) {
                case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
                case CONNMAN_IPCONFIG_METHOD_OFF:
                        return FALSE;
index 8f52fc0..7a7d6c8 100644 (file)
@@ -1812,6 +1812,8 @@ int __connman_service_disconnect(struct connman_service *service)
        } else
                return -EOPNOTSUPP;
 
+       __connman_ipconfig_clear_address(service->ipconfig);
+
        __connman_ipconfig_disable(service->ipconfig);
 
        if (err < 0) {