summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/service-api.txt9
-rw-r--r--src/connman.h4
-rw-r--r--src/ipconfig.c85
-rw-r--r--src/service.c37
-rwxr-xr-xtest/list-services3
-rwxr-xr-xtest/monitor-services4
6 files changed, 138 insertions, 4 deletions
diff --git a/doc/service-api.txt b/doc/service-api.txt
index c1dd5419..c4e1495d 100644
--- a/doc/service-api.txt
+++ b/doc/service-api.txt
@@ -417,6 +417,15 @@ Properties string State [readonly]
Automatic proxy configuration URL.
+ dict Proxy.Configuration [readwrite]
+
+ Same values as Proxy property. The Proxy represents
+ the actual system configuration while this allows
+ user configuration.
+
+ Currently only setting Method to either "direct"
+ or "auto" is supported.
+
dict Provider [readonly]
string Host [readonly]
diff --git a/src/connman.h b/src/connman.h
index 591e4f7f..21bf9e94 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -230,6 +230,10 @@ int __connman_ipconfig_set_config(struct connman_ipconfig *ipconfig,
enum connman_ipconfig_type type, DBusMessageIter *array);
void __connman_ipconfig_append_proxy(struct connman_ipconfig *ipconfig,
DBusMessageIter *iter);
+void __connman_ipconfig_append_proxyconfig(struct connman_ipconfig *ipconfig,
+ DBusMessageIter *iter);
+int __connman_ipconfig_set_proxyconfig(struct connman_ipconfig *ipconfig,
+ DBusMessageIter *array);
void __connman_ipconfig_append_ethernet(struct connman_ipconfig *ipconfig,
DBusMessageIter *iter);
enum connman_ipconfig_method __connman_ipconfig_get_method(
diff --git a/src/ipconfig.c b/src/ipconfig.c
index dbf8f5ab..0a7eb8bc 100644
--- a/src/ipconfig.c
+++ b/src/ipconfig.c
@@ -73,6 +73,8 @@ struct connman_ipdevice {
GSList *address_list;
char *ipv4_gateway;
char *ipv6_gateway;
+
+ char *proxy;
char *pac;
struct connman_ipconfig *config;
@@ -303,6 +305,7 @@ static void free_ipdevice(gpointer data)
free_address_list(ipdevice);
g_free(ipdevice->ipv4_gateway);
g_free(ipdevice->ipv6_gateway);
+ g_free(ipdevice->proxy);
g_free(ipdevice->pac);
g_free(ipdevice->address);
@@ -1624,6 +1627,88 @@ done:
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)
{
diff --git a/src/service.c b/src/service.c
index 427ebcc5..42aac9f4 100644
--- a/src/service.c
+++ b/src/service.c
@@ -944,6 +944,14 @@ static void append_proxy(DBusMessageIter *iter, void *user_data)
__connman_ipconfig_append_proxy(service->ipconfig, iter);
}
+static void append_proxyconfig(DBusMessageIter *iter, void *user_data)
+{
+ struct connman_service *service = user_data;
+
+ if (service->ipconfig != NULL)
+ __connman_ipconfig_append_proxyconfig(service->ipconfig, iter);
+}
+
static void append_provider(DBusMessageIter *iter, void *user_data)
{
struct connman_service *service = user_data;
@@ -1026,6 +1034,15 @@ static void proxy_changed(struct connman_service *service)
append_proxy, service);
}
+static void proxy_configuration_changed(struct connman_service *service)
+{
+ connman_dbus_property_changed_dict(service->path,
+ CONNMAN_SERVICE_INTERFACE, "Proxy.Configuration",
+ append_proxyconfig, service);
+
+ proxy_changed(service);
+}
+
static void link_changed(struct connman_service *service)
{
connman_dbus_property_changed_dict(service->path,
@@ -1415,7 +1432,11 @@ static void append_properties(DBusMessageIter *dict, dbus_bool_t limited,
connman_dbus_dict_append_dict(dict, "Proxy", append_proxy, service);
- connman_dbus_dict_append_dict(dict, "Provider", append_provider, service);
+ connman_dbus_dict_append_dict(dict, "Proxy.Configuration",
+ append_proxyconfig, service);
+
+ connman_dbus_dict_append_dict(dict, "Provider",
+ append_provider, service);
}
static void append_struct(gpointer value, gpointer user_data)
@@ -1743,6 +1764,20 @@ static DBusMessage *set_property(DBusConnection *conn,
domain_configuration_changed(service);
__connman_storage_save_service(service);
+ } else if (g_str_equal(name, "Proxy.Configuration") == TRUE) {
+ int err;
+
+ if (service->ipconfig == NULL)
+ return __connman_error_invalid_property(msg);
+
+ err = __connman_ipconfig_set_proxyconfig(service->ipconfig,
+ &value);
+ if (err < 0)
+ return __connman_error_failed(msg, -err);
+
+ proxy_configuration_changed(service);
+
+ __connman_storage_save_service(service);
} else if (g_str_equal(name, "IPv4.Configuration") == TRUE ||
g_str_equal(name, "IPv6.Configuration")) {
diff --git a/test/list-services b/test/list-services
index a8940921..88eea693 100755
--- a/test/list-services
+++ b/test/list-services
@@ -38,7 +38,8 @@ for path in properties["Services"]:
for key in properties.keys():
if key in ["IPv4", "IPv4.Configuration",
"IPv6", "IPv6.Configuration",
- "Proxy", "Ethernet", "Provider"]:
+ "Proxy", "Proxy.Configuration",
+ "Ethernet", "Provider"]:
val = extract_values(properties[key])
elif key in ["Nameservers", "Nameservers.Configuration",
"Domains", "Domains.Configuration"]:
diff --git a/test/monitor-services b/test/monitor-services
index 05d1e1d9..ceeba790 100755
--- a/test/monitor-services
+++ b/test/monitor-services
@@ -29,8 +29,8 @@ def property_changed(name, value, path):
val = val + " " + i[i.rfind("/") + 1:]
val = val + " ]"
elif name in ["IPv4", "IPv4.Configuration",
- "IPv6", "IPv6.Configuration",
- "Proxy", "Ethernet"]:
+ "IPv6", "IPv6.Configuration",
+ "Proxy", "Proxy.Configuration", "Ethernet"]:
val = extract_values(value)
elif name in ["Nameservers", "Nameservers.Configuration",
"Domains", "Domains.Configuration"]: