uint32_t tx_dropped;
GSList *address_list;
- char *gateway;
+ char *ipv4_gateway;
+ char *ipv6_gateway;
+
+ char *proxy;
+ char *pac;
struct connman_ipconfig *config;
static GHashTable *ipdevice_hash = NULL;
static GList *ipconfig_list = NULL;
-struct connman_ipaddress *connman_ipaddress_alloc(void)
+struct connman_ipaddress *connman_ipaddress_alloc(int family)
{
struct connman_ipaddress *ipaddress;
if (ipaddress == NULL)
return NULL;
+ ipaddress->family = family;
ipaddress->prefixlen = 0;
ipaddress->local = NULL;
ipaddress->peer = NULL;
if (ipaddress == NULL || source == NULL)
return;
+ ipaddress->family = source->family;
ipaddress->prefixlen = source->prefixlen;
g_free(ipaddress->local);
connman_ipconfig_unref(ipdevice->config);
free_address_list(ipdevice);
- g_free(ipdevice->gateway);
+ g_free(ipdevice->ipv4_gateway);
+ g_free(ipdevice->ipv6_gateway);
+ g_free(ipdevice->proxy);
+ g_free(ipdevice->pac);
g_free(ipdevice->address);
g_free(ipdevice->ifname);
ipdevice->rx_dropped = stats->rx_dropped;
ipdevice->tx_dropped = stats->tx_dropped;
- __connman_counter_notify(ipdevice->config,
+ __connman_service_notify(ipdevice->config,
ipdevice->rx_packets, ipdevice->tx_packets,
ipdevice->rx_bytes, ipdevice->tx_bytes,
ipdevice->rx_errors, ipdevice->tx_errors,
if (ipdevice == NULL)
return;
- ipaddress = connman_ipaddress_alloc();
+ ipaddress = connman_ipaddress_alloc(family);
if (ipaddress == NULL)
return;
}
}
-void __connman_ipconfig_newroute(int index, unsigned char scope,
+void __connman_ipconfig_newroute(int index, int family, unsigned char scope,
const char *dst, const char *gateway)
{
struct connman_ipdevice *ipdevice;
if (scope == 0 && g_strcmp0(dst, "0.0.0.0") == 0) {
GSList *list;
- g_free(ipdevice->gateway);
- ipdevice->gateway = g_strdup(gateway);
+ if (family == AF_INET6) {
+ g_free(ipdevice->ipv6_gateway);
+ ipdevice->ipv6_gateway = g_strdup(gateway);
+ } else {
+ g_free(ipdevice->ipv4_gateway);
+ ipdevice->ipv4_gateway = g_strdup(gateway);
+ }
if (ipdevice->config != NULL &&
ipdevice->config->system != NULL) {
scope, scope2str(scope));
}
-void __connman_ipconfig_delroute(int index, unsigned char scope,
+void __connman_ipconfig_delroute(int index, int family, unsigned char scope,
const char *dst, const char *gateway)
{
struct connman_ipdevice *ipdevice;
if (scope == 0 && g_strcmp0(dst, "0.0.0.0") == 0) {
GSList *list;
- g_free(ipdevice->gateway);
- ipdevice->gateway = NULL;
+ if (family == AF_INET6) {
+ g_free(ipdevice->ipv6_gateway);
+ ipdevice->ipv6_gateway = NULL;
+ } else {
+ g_free(ipdevice->ipv4_gateway);
+ ipdevice->ipv4_gateway = NULL;
+ }
if (ipdevice->config != NULL &&
ipdevice->config->system != NULL) {
if (ipdevice == NULL)
return NULL;
- if (ipdevice->gateway != NULL)
- return ipdevice->gateway;
+ if (ipdevice->ipv4_gateway != NULL)
+ return ipdevice->ipv4_gateway;
if (ipdevice->config != NULL &&
ipdevice->config->address != NULL)
ipv6config->index = index;
ipv6config->type = CONNMAN_IPCONFIG_TYPE_IPV6;
+ ipv6config->method = CONNMAN_IPCONFIG_METHOD_OFF;
- ipv6config->address = connman_ipaddress_alloc();
+ ipv6config->address = connman_ipaddress_alloc(AF_INET6);
if (ipv6config->address == NULL) {
g_free(ipv6config);
return NULL;
}
- ipv6config->system = connman_ipaddress_alloc();
+ ipv6config->system = connman_ipaddress_alloc(AF_INET6);
ipv6config->ipv6 = NULL;
ipconfig->index = index;
ipconfig->type = CONNMAN_IPCONFIG_TYPE_IPV4;
- ipconfig->address = connman_ipaddress_alloc();
+ ipconfig->address = connman_ipaddress_alloc(AF_INET);
if (ipconfig->address == NULL) {
g_free(ipconfig);
return NULL;
}
- ipconfig->system = connman_ipaddress_alloc();
+ ipconfig->system = connman_ipaddress_alloc(AF_INET);
ipconfig->ipv6 = create_ipv6config(index);
return 0;
}
+int __connman_ipconfig_set_proxy_autoconfig(struct connman_ipconfig *ipconfig,
+ const char *url)
+{
+ struct connman_ipdevice *ipdevice;
+
+ DBG("ipconfig %p", ipconfig);
+
+ if (ipconfig == NULL || ipconfig->index < 0)
+ return -ENODEV;
+
+ ipdevice = g_hash_table_lookup(ipdevice_hash,
+ GINT_TO_POINTER(ipconfig->index));
+ if (ipdevice == NULL)
+ return -ENXIO;
+
+ g_free(ipdevice->pac);
+ ipdevice->pac = g_strdup(url);
+
+ return 0;
+}
+
+const char *__connman_ipconfig_get_proxy_autoconfig(struct connman_ipconfig *ipconfig)
+{
+ struct connman_ipdevice *ipdevice;
+
+ DBG("ipconfig %p", ipconfig);
+
+ if (ipconfig == NULL || ipconfig->index < 0)
+ return NULL;
+
+ ipdevice = g_hash_table_lookup(ipdevice_hash,
+ GINT_TO_POINTER(ipconfig->index));
+ if (ipdevice == NULL)
+ return NULL;
+
+ return ipdevice->pac;
+}
+
int __connman_ipconfig_enable(struct connman_ipconfig *ipconfig)
{
struct connman_ipdevice *ipdevice;
void __connman_ipconfig_append_proxy(struct connman_ipconfig *ipconfig,
DBusMessageIter *iter)
{
+ struct connman_ipdevice *ipdevice;
const char *method = "direct";
+ ipdevice = g_hash_table_lookup(ipdevice_hash,
+ GINT_TO_POINTER(ipconfig->index));
+ if (ipdevice == NULL)
+ goto done;
+
+ if (ipdevice->pac == NULL)
+ goto done;
+
+ method = "auto-config";
+
+ connman_dbus_dict_append_basic(iter, "URL",
+ DBUS_TYPE_STRING, &ipdevice->pac);
+
+done:
+ connman_dbus_dict_append_basic(iter, "Method",
+ DBUS_TYPE_STRING, &method);
+}
+
+void __connman_ipconfig_append_proxyconfig(struct connman_ipconfig *ipconfig,
+ DBusMessageIter *iter)
+{
+ struct connman_ipdevice *ipdevice;
+ const char *method = "auto";
+
+ ipdevice = g_hash_table_lookup(ipdevice_hash,
+ GINT_TO_POINTER(ipconfig->index));
+ if (ipdevice == NULL)
+ goto done;
+
+ if (ipdevice->proxy == NULL)
+ goto done;
+
+ method = ipdevice->proxy;
+
+done:
connman_dbus_dict_append_basic(iter, "Method",
DBUS_TYPE_STRING, &method);
}
+int __connman_ipconfig_set_proxyconfig(struct connman_ipconfig *ipconfig,
+ DBusMessageIter *array)
+{
+ struct connman_ipdevice *ipdevice;
+ DBusMessageIter dict;
+ const char *method;
+
+ DBG("ipconfig %p", ipconfig);
+
+ ipdevice = g_hash_table_lookup(ipdevice_hash,
+ GINT_TO_POINTER(ipconfig->index));
+ if (ipdevice == NULL)
+ return -ENXIO;
+
+ if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY)
+ return -EINVAL;
+
+ dbus_message_iter_recurse(array, &dict);
+
+ while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) {
+ DBusMessageIter entry;
+ const char *key;
+ int type;
+
+ dbus_message_iter_recurse(&dict, &entry);
+
+ if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&entry, &key);
+ dbus_message_iter_next(&entry);
+
+ type = dbus_message_iter_get_arg_type(&entry);
+
+ if (g_str_equal(key, "Method") == TRUE) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&entry, &method);
+ if (strlen(method) == 0)
+ method = NULL;
+ }
+
+ dbus_message_iter_next(&dict);
+ }
+
+ DBG("method %s", method);
+
+ if (method == NULL)
+ return -EINVAL;
+
+ if (g_str_equal(method, "auto") == FALSE &&
+ g_str_equal(method, "direct") == FALSE)
+ return -EINVAL;
+
+ g_free(ipdevice->proxy);
+ ipdevice->proxy = g_strdup(method);
+
+ return 0;
+}
+
void __connman_ipconfig_append_ethernet(struct connman_ipconfig *ipconfig,
DBusMessageIter *iter)
{
key = g_strdup_printf("%smethod", prefix);
method = g_key_file_get_string(keyfile, identifier, key, NULL);
- if (method == NULL)
- ipconfig->method = CONNMAN_IPCONFIG_METHOD_DHCP;
- else
+ if (method == NULL) {
+ if (ipconfig->type == CONNMAN_IPCONFIG_TYPE_IPV4)
+ ipconfig->method = CONNMAN_IPCONFIG_METHOD_DHCP;
+ else
+ ipconfig->method = CONNMAN_IPCONFIG_METHOD_OFF;
+ } else
ipconfig->method = __connman_ipconfig_string2method(method);
g_free(key);