Don't filter out interfaces within IP configuration
[platform/upstream/connman.git] / src / ipconfig.c
index 91ce244..ac26203 100644 (file)
@@ -90,6 +90,7 @@ void connman_ipaddress_free(struct connman_ipaddress *ipaddress)
        g_free(ipaddress->broadcast);
        g_free(ipaddress->peer);
        g_free(ipaddress->local);
+       g_free(ipaddress->gateway);
        g_free(ipaddress);
 }
 
@@ -110,7 +111,7 @@ static unsigned char netmask2prefixlen(const char *netmask)
 }
 
 void connman_ipaddress_set(struct connman_ipaddress *ipaddress,
-                               const char *address, const char *netmask)
+               const char *address, const char *netmask, const char *gateway)
 {
        if (ipaddress == NULL)
                return;
@@ -122,6 +123,9 @@ void connman_ipaddress_set(struct connman_ipaddress *ipaddress,
 
        g_free(ipaddress->local);
        ipaddress->local = g_strdup(address);
+
+       g_free(ipaddress->gateway);
+       ipaddress->gateway = g_strdup(gateway);
 }
 
 void connman_ipaddress_clear(struct connman_ipaddress *ipaddress)
@@ -139,6 +143,9 @@ void connman_ipaddress_clear(struct connman_ipaddress *ipaddress)
 
        g_free(ipaddress->broadcast);
        ipaddress->broadcast = NULL;
+
+       g_free(ipaddress->gateway);
+       ipaddress->gateway = NULL;
 }
 
 void connman_ipaddress_copy(struct connman_ipaddress *ipaddress,
@@ -157,6 +164,9 @@ void connman_ipaddress_copy(struct connman_ipaddress *ipaddress,
 
        g_free(ipaddress->broadcast);
        ipaddress->broadcast = g_strdup(source->broadcast);
+
+       g_free(ipaddress->gateway);
+       ipaddress->gateway = g_strdup(source->gateway);
 }
 
 static void free_address_list(struct connman_ipdevice *ipdevice)
@@ -371,7 +381,6 @@ void __connman_ipconfig_newlink(int index, unsigned short type,
        GString *str;
        gboolean up = FALSE, down = FALSE;
        gboolean lower_up = FALSE, lower_down = FALSE;
-       char *ifname;
 
        DBG("index %d", index);
 
@@ -382,22 +391,12 @@ void __connman_ipconfig_newlink(int index, unsigned short type,
        if (ipdevice != NULL)
                goto update;
 
-       ifname = connman_inet_ifname(index);
-
-       if (__connman_element_device_isfiltered(ifname) == TRUE) {
-               connman_info("Ignoring interface %s (filtered)", ifname);
-               g_free(ifname);
-               return;
-       }
-
        ipdevice = g_try_new0(struct connman_ipdevice, 1);
-       if (ipdevice == NULL) {
-               g_free(ifname);
+       if (ipdevice == NULL)
                return;
-       }
 
        ipdevice->index = index;
-       ipdevice->ifname = ifname;
+       ipdevice->ifname = connman_inet_ifname(index);
        ipdevice->type = type;
 
        ipdevice->address = g_strdup(address);
@@ -624,8 +623,23 @@ void __connman_ipconfig_newroute(int index, unsigned char scope,
                return;
 
        if (scope == 0 && g_strcmp0(dst, "0.0.0.0") == 0) {
+               GSList *list;
+
                g_free(ipdevice->gateway);
                ipdevice->gateway = g_strdup(gateway);
+
+               if (ipdevice->config != NULL &&
+                                       ipdevice->config->system != NULL) {
+                       g_free(ipdevice->config->system->gateway);
+                       ipdevice->config->system->gateway = g_strdup(gateway);
+               }
+
+               for (list = ipdevice->address_list; list; list = list->next) {
+                       struct connman_ipaddress *ipaddress = list->data;
+
+                       g_free(ipaddress->gateway);
+                       ipaddress->gateway = g_strdup(gateway);
+               }
        }
 
        connman_info("%s {add} route %s gw %s scope %u <%s>",
@@ -645,8 +659,23 @@ void __connman_ipconfig_delroute(int index, unsigned char scope,
                return;
 
        if (scope == 0 && g_strcmp0(dst, "0.0.0.0") == 0) {
+               GSList *list;
+
                g_free(ipdevice->gateway);
                ipdevice->gateway = NULL;
+
+               if (ipdevice->config != NULL &&
+                                       ipdevice->config->system != NULL) {
+                       g_free(ipdevice->config->system->gateway);
+                       ipdevice->config->system->gateway = NULL;
+               }
+
+               for (list = ipdevice->address_list; list; list = list->next) {
+                       struct connman_ipaddress *ipaddress = list->data;
+
+                       g_free(ipaddress->gateway);
+                       ipaddress->gateway = NULL;
+               }
        }
 
        connman_info("%s {del} route %s gw %s scope %u <%s>",
@@ -705,6 +734,11 @@ const char *__connman_ipconfig_get_gateway(int index)
        return ipdevice->gateway;
 }
 
+void __connman_ipconfig_set_index(struct connman_ipconfig *ipconfig, int index)
+{
+       ipconfig->index = index;
+}
+
 /**
  * connman_ipconfig_create:
  *
@@ -833,6 +867,9 @@ void connman_ipconfig_set_data(struct connman_ipconfig *ipconfig, void *data)
  */
 int connman_ipconfig_get_index(struct connman_ipconfig *ipconfig)
 {
+       if (ipconfig == NULL)
+               return -1;
+
        if (ipconfig->origin != NULL)
                return ipconfig->origin->index;
 
@@ -849,6 +886,9 @@ const char *connman_ipconfig_get_ifname(struct connman_ipconfig *ipconfig)
 {
        struct connman_ipdevice *ipdevice;
 
+       if (ipconfig == NULL)
+               return NULL;
+
        if (ipconfig->index < 0)
                return NULL;
 
@@ -888,8 +928,7 @@ int connman_ipconfig_set_method(struct connman_ipconfig *ipconfig,
        return 0;
 }
 
-enum connman_ipconfig_method __connman_ipconfig_get_method(
-                               struct connman_ipconfig *ipconfig)
+enum connman_ipconfig_method __connman_ipconfig_get_method(struct connman_ipconfig *ipconfig)
 {
        if (ipconfig == NULL)
                return CONNMAN_IPCONFIG_METHOD_UNKNOWN;
@@ -916,6 +955,24 @@ void connman_ipconfig_bind(struct connman_ipconfig *ipconfig,
        connman_inet_set_address(origin->index, origin->address);
 }
 
+/* FIXME: The element soulution should be removed in the future */
+int __connman_ipconfig_set_gateway(struct connman_ipconfig *ipconfig,
+                                               struct connman_element *parent)
+{
+       struct connman_element *connection;
+
+       connection = connman_element_create(NULL);
+
+       connection->type  = CONNMAN_ELEMENT_TYPE_CONNECTION;
+       connection->index = ipconfig->index;
+       connection->ipv4.gateway = ipconfig->address->gateway;
+
+       if (connman_element_register(connection, parent) < 0)
+               connman_element_unref(connection);
+
+       return 0;
+}
+
 int __connman_ipconfig_set_address(struct connman_ipconfig *ipconfig)
 {
        DBG("");
@@ -938,6 +995,11 @@ int __connman_ipconfig_clear_address(struct connman_ipconfig *ipconfig)
 {
        DBG("");
 
+       if (ipconfig == NULL)
+               return 0;
+
+       DBG("method %d", ipconfig->method);
+
        switch (ipconfig->method) {
        case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
        case CONNMAN_IPCONFIG_METHOD_OFF:
@@ -1071,6 +1133,10 @@ void __connman_ipconfig_append_ipv4(struct connman_ipconfig *ipconfig,
                connman_dbus_dict_append_basic(iter, "Netmask",
                                                DBUS_TYPE_STRING, &mask);
        }
+
+       if (ipconfig->system->gateway != NULL)
+               connman_dbus_dict_append_basic(iter, "Gateway",
+                               DBUS_TYPE_STRING, &ipconfig->system->gateway);
 }
 
 void __connman_ipconfig_append_ipv4config(struct connman_ipconfig *ipconfig,
@@ -1111,13 +1177,17 @@ void __connman_ipconfig_append_ipv4config(struct connman_ipconfig *ipconfig,
                connman_dbus_dict_append_basic(iter, "Netmask",
                                                DBUS_TYPE_STRING, &mask);
        }
+
+       if (ipconfig->address->gateway != NULL)
+               connman_dbus_dict_append_basic(iter, "Gateway",
+                               DBUS_TYPE_STRING, &ipconfig->address->gateway);
 }
 
 int __connman_ipconfig_set_ipv4config(struct connman_ipconfig *ipconfig,
                                                        DBusMessageIter *array)
 {
        enum connman_ipconfig_method method = CONNMAN_IPCONFIG_METHOD_UNKNOWN;
-       const char *address = NULL, *netmask = NULL;
+       const char *address = NULL, *netmask = NULL, *gateway = NULL;
        DBusMessageIter dict;
 
        DBG("ipconfig %p", ipconfig);
@@ -1160,12 +1230,17 @@ int __connman_ipconfig_set_ipv4config(struct connman_ipconfig *ipconfig,
                                return -EINVAL;
 
                        dbus_message_iter_get_basic(&entry, &netmask);
-               }
+               } else if (g_str_equal(key, "Gateway") == TRUE) {
+                       if (type != DBUS_TYPE_STRING)
+                               return -EINVAL;
 
+                       dbus_message_iter_get_basic(&entry, &gateway);
+               }
                dbus_message_iter_next(&dict);
        }
 
-       DBG("method %d address %s netmask %s", method, address, netmask);
+       DBG("method %d address %s netmask %s gateway %s",
+                               method, address, netmask, gateway);
 
        switch (method) {
        case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
@@ -1178,7 +1253,8 @@ int __connman_ipconfig_set_ipv4config(struct connman_ipconfig *ipconfig,
                        return -EINVAL;
 
                ipconfig->method = method;
-               connman_ipaddress_set(ipconfig->address, address, netmask);
+               connman_ipaddress_set(ipconfig->address,
+                               address, netmask, gateway);
                break;
 
        case CONNMAN_IPCONFIG_METHOD_DHCP:
@@ -1264,6 +1340,11 @@ int __connman_ipconfig_load(struct connman_ipconfig *ipconfig,
                                keyfile, identifier, key, NULL);
        g_free(key);
 
+       key = g_strdup_printf("%sgateway", prefix);
+       ipconfig->address->gateway = g_key_file_get_string(
+                               keyfile, identifier, key, NULL);
+       g_free(key);
+
        return 0;
 }
 
@@ -1301,7 +1382,13 @@ int __connman_ipconfig_save(struct connman_ipconfig *ipconfig,
        key = g_strdup_printf("%sbroadcast_address", prefix);
        if (ipconfig->address->broadcast != NULL)
                g_key_file_set_string(keyfile, identifier,
-                       "broadcast_address", ipconfig->address->broadcast);
+                       key, ipconfig->address->broadcast);
+       g_free(key);
+
+       key = g_strdup_printf("%sgateway", prefix);
+       if (ipconfig->address->gateway != NULL)
+               g_key_file_set_string(keyfile, identifier,
+                       key, ipconfig->address->gateway);
        g_free(key);
 
        return 0;