g_free(ipaddress->broadcast);
g_free(ipaddress->peer);
g_free(ipaddress->local);
+ g_free(ipaddress->gateway);
g_free(ipaddress);
}
}
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;
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)
g_free(ipaddress->broadcast);
ipaddress->broadcast = NULL;
+
+ g_free(ipaddress->gateway);
+ ipaddress->gateway = NULL;
}
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)
GString *str;
gboolean up = FALSE, down = FALSE;
gboolean lower_up = FALSE, lower_down = FALSE;
- char *ifname;
DBG("index %d", index);
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);
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>",
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>",
return ipdevice->gateway;
}
+void __connman_ipconfig_set_index(struct connman_ipconfig *ipconfig, int index)
+{
+ ipconfig->index = index;
+}
+
/**
* connman_ipconfig_create:
*
*/
int connman_ipconfig_get_index(struct connman_ipconfig *ipconfig)
{
+ if (ipconfig == NULL)
+ return -1;
+
if (ipconfig->origin != NULL)
return ipconfig->origin->index;
{
struct connman_ipdevice *ipdevice;
+ if (ipconfig == NULL)
+ return NULL;
+
if (ipconfig->index < 0)
return NULL;
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;
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("");
{
DBG("");
+ if (ipconfig == NULL)
+ return 0;
+
+ DBG("method %d", ipconfig->method);
+
switch (ipconfig->method) {
case CONNMAN_IPCONFIG_METHOD_UNKNOWN:
case CONNMAN_IPCONFIG_METHOD_OFF:
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,
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);
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:
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:
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;
}
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;