+ return __connman_error_failed(msg, -err);
+ } else if (g_str_equal(name, "Priority") == TRUE) {
+ connman_uint8_t priority;
+
+ if (type != DBUS_TYPE_BYTE)
+ return __connman_error_invalid_arguments(msg);
+
+ dbus_message_iter_get_basic(&value, &priority);
+
+ device->priority = priority;
+ } else if (g_str_equal(name, "ScanInterval") == TRUE) {
+ connman_uint16_t interval;
+
+ switch (device->mode) {
+ case CONNMAN_DEVICE_MODE_UNKNOWN:
+ case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
+ return __connman_error_invalid_arguments(msg);
+ case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
+ case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
+ break;
+ }
+
+ if (type != DBUS_TYPE_UINT16)
+ return __connman_error_invalid_arguments(msg);
+
+ dbus_message_iter_get_basic(&value, &interval);
+
+ device->scan_interval = interval;
+
+ if (device->scan_timeout > 0) {
+ g_source_remove(device->scan_timeout);
+ device->scan_timeout = 0;
+ }
+
+ if (device->scan_interval > 0) {
+ guint interval = device->scan_interval;
+ device->scan_timeout = g_timeout_add_seconds(interval,
+ device_scan_trigger, device);
+ }
+ } else if (g_str_has_prefix(name, "IPv4") == TRUE) {
+ switch (device->mode) {
+ case CONNMAN_DEVICE_MODE_UNKNOWN:
+ case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
+ case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
+ return __connman_error_invalid_arguments(msg);
+ case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
+ __connman_element_set_ipv4(&device->element,
+ name, &value);
+ break;
+ }
+ }
+
+ __connman_storage_save_device(device);
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *join_network(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ struct connman_device *device = data;
+ struct connman_network *network;
+ enum connman_network_type type;
+ DBusMessageIter iter, array;
+ int err, index;
+
+ DBG("conn %p", conn);
+
+ if (__connman_security_check_privilege(msg,
+ CONNMAN_SECURITY_PRIVILEGE_MODIFY) < 0)
+ return __connman_error_permission_denied(msg);
+
+ if (!device->driver || !device->driver->join)
+ return __connman_error_not_supported(msg);
+
+ dbus_message_iter_init(msg, &iter);
+ dbus_message_iter_recurse(&iter, &array);
+
+ switch (device->type) {
+ case CONNMAN_DEVICE_TYPE_WIFI:
+ type = CONNMAN_NETWORK_TYPE_WIFI;
+ break;
+ default:
+ return __connman_error_not_supported(msg);
+ }
+
+ network = connman_network_create("00_00_00_00_00_00", type);
+ if (network == NULL)
+ return __connman_error_failed(msg, ENOMEM);
+
+ while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) {
+ DBusMessageIter entry, value;
+ const char *key, *str;
+
+ dbus_message_iter_recurse(&array, &entry);
+ dbus_message_iter_get_basic(&entry, &key);
+
+ dbus_message_iter_next(&entry);
+ dbus_message_iter_recurse(&entry, &value);
+
+ switch (dbus_message_iter_get_arg_type(&value)) {
+ case DBUS_TYPE_STRING:
+ dbus_message_iter_get_basic(&value, &str);
+ if (g_str_equal(key, "WiFi.SSID") == TRUE)
+ connman_network_set_blob(network, key,
+ str, strlen(str));
+ else
+ connman_network_set_string(network, key, str);
+ break;
+ }
+
+ dbus_message_iter_next(&array);