+/**
+ * connman_device_set_carrier:
+ * @device: device structure
+ * @carrier: carrier state
+ *
+ * Change carrier state of device (only for device without scanning)
+ */
+int connman_device_set_carrier(struct connman_device *device,
+ gboolean carrier)
+{
+ DBG("driver %p carrier %d", device, carrier);
+
+ if (device->mode != CONNMAN_DEVICE_MODE_NO_NETWORK)
+ return -EINVAL;
+
+ if (device->carrier == carrier)
+ return -EALREADY;
+
+ device->carrier = carrier;
+
+ if (carrier == TRUE) {
+ struct connman_element *element;
+
+ element = connman_element_create(NULL);
+ if (element != NULL) {
+ element->type = CONNMAN_ELEMENT_TYPE_DEVICE;
+ element->subtype = CONNMAN_ELEMENT_SUBTYPE_NETWORK;
+ element->index = device->element.index;
+
+ if (connman_element_register(element,
+ &device->element) < 0)
+ connman_element_unref(element);
+ }
+ } else
+ connman_element_unregister_children(&device->element);
+
+ return 0;
+}
+
+/**
+ * connman_device_set_scanning:
+ * @device: device structure
+ * @scanning: scanning state
+ *
+ * Change scanning state of device
+ */
+int connman_device_set_scanning(struct connman_device *device,
+ gboolean scanning)
+{
+ DBusMessage *signal;
+ DBusMessageIter entry, value;
+ const char *key = "Scanning";
+
+ DBG("driver %p scanning %d", device, scanning);
+
+ if (!device->driver || !device->driver->scan)
+ return -EINVAL;
+
+ if (device->scanning == scanning)
+ return -EALREADY;
+
+ device->scanning = scanning;
+
+ signal = dbus_message_new_signal(device->element.path,
+ CONNMAN_DEVICE_INTERFACE, "PropertyChanged");
+ if (signal == NULL)
+ return 0;
+
+ dbus_message_iter_init_append(signal, &entry);
+
+ dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
+
+ dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_BOOLEAN_AS_STRING, &value);
+ dbus_message_iter_append_basic(&value, DBUS_TYPE_BOOLEAN, &scanning);
+ dbus_message_iter_close_container(&entry, &value);
+
+ g_dbus_send_message(connection, signal);
+
+ return 0;
+}
+
+/**
+ * connman_device_add_network:
+ * @device: device structure
+ * @network: network structure
+ *
+ * Add new network to the device
+ */
+int connman_device_add_network(struct connman_device *device,
+ struct connman_network *network)
+{
+ const char *identifier = connman_network_get_identifier(network);
+ int err;
+
+ DBG("device %p network %p", device, network);
+
+ if (device->mode == CONNMAN_DEVICE_MODE_NO_NETWORK)
+ return -EINVAL;
+
+ err = connman_element_register((struct connman_element *) network,
+ &device->element);
+ if (err < 0)
+ return err;
+
+ g_hash_table_insert(device->networks, g_strdup(identifier),
+ network);
+
+ return 0;
+}
+
+/**
+ * connman_device_get_network:
+ * @device: device structure
+ * @identifier: network identifier
+ *
+ * Get network for given identifier
+ */
+struct connman_network *connman_device_get_network(struct connman_device *device,
+ const char *identifier)
+{
+ DBG("device %p identifier %s", device, identifier);
+
+ return g_hash_table_lookup(device->networks, identifier);
+}
+
+/**
+ * connman_device_remove_network:
+ * @device: device structure
+ * @identifier: network identifier
+ *
+ * Remove network for given identifier
+ */
+int connman_device_remove_network(struct connman_device *device,
+ const char *identifier)
+{
+ DBG("device %p identifier %s", device, identifier);
+
+ g_hash_table_remove(device->networks, identifier);
+
+ return 0;
+}
+
+/**
+ * connman_device_register:
+ * @device: device structure
+ *
+ * Register device with the system
+ */
+int connman_device_register(struct connman_device *device)
+{
+ return connman_element_register(&device->element, NULL);
+}
+
+/**
+ * connman_device_unregister:
+ * @device: device structure
+ *
+ * Unregister device with the system
+ */
+void connman_device_unregister(struct connman_device *device)
+{
+ connman_element_unregister(&device->element);
+}
+
+/**
+ * connman_device_get_data:
+ * @device: device structure
+ *
+ * Get private device data pointer
+ */
+void *connman_device_get_data(struct connman_device *device)
+{
+ return device->driver_data;
+}
+
+/**
+ * connman_device_set_data:
+ * @device: device structure
+ * @data: data pointer
+ *
+ * Set private device data pointer
+ */
+void connman_device_set_data(struct connman_device *device, void *data)
+{
+ device->driver_data = data;
+}
+
+static void device_enable(struct connman_device *device)
+{
+ DBG("device %p", device);
+
+ if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE ||
+ device->policy == CONNMAN_DEVICE_POLICY_OFF)
+ return;
+
+ if (device->powered == TRUE)
+ return;
+
+ if (device->driver->enable)
+ device->driver->enable(device);
+}
+
+static void device_disable(struct connman_device *device)
+{
+ DBG("device %p", device);
+
+ if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE)
+ return;
+
+ if (device->powered == FALSE)
+ return;
+
+ if (device->driver->disable)
+ device->driver->disable(device);
+}
+