5 * Copyright (C) 2007-2009 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
31 struct connman_device {
32 struct connman_element element;
33 enum connman_device_type type;
34 enum connman_device_mode mode;
35 enum connman_device_policy policy;
42 struct connman_device_driver *driver;
48 static const char *type2description(enum connman_device_type type)
51 case CONNMAN_DEVICE_TYPE_UNKNOWN:
52 case CONNMAN_DEVICE_TYPE_VENDOR:
54 case CONNMAN_DEVICE_TYPE_ETHERNET:
56 case CONNMAN_DEVICE_TYPE_WIFI:
58 case CONNMAN_DEVICE_TYPE_WIMAX:
60 case CONNMAN_DEVICE_TYPE_BLUETOOTH:
62 case CONNMAN_DEVICE_TYPE_HSO:
63 case CONNMAN_DEVICE_TYPE_NOZOMI:
64 case CONNMAN_DEVICE_TYPE_HUAWEI:
65 case CONNMAN_DEVICE_TYPE_NOVATEL:
72 static const char *type2string(enum connman_device_type type)
75 case CONNMAN_DEVICE_TYPE_UNKNOWN:
76 case CONNMAN_DEVICE_TYPE_VENDOR:
78 case CONNMAN_DEVICE_TYPE_ETHERNET:
80 case CONNMAN_DEVICE_TYPE_WIFI:
82 case CONNMAN_DEVICE_TYPE_WIMAX:
84 case CONNMAN_DEVICE_TYPE_BLUETOOTH:
86 case CONNMAN_DEVICE_TYPE_HSO:
87 case CONNMAN_DEVICE_TYPE_HUAWEI:
88 case CONNMAN_DEVICE_TYPE_NOZOMI:
89 case CONNMAN_DEVICE_TYPE_NOVATEL:
96 static const char *policy2string(enum connman_device_policy policy)
99 case CONNMAN_DEVICE_POLICY_UNKNOWN:
101 case CONNMAN_DEVICE_POLICY_IGNORE:
103 case CONNMAN_DEVICE_POLICY_OFF:
105 case CONNMAN_DEVICE_POLICY_AUTO:
107 case CONNMAN_DEVICE_POLICY_MANUAL:
114 static enum connman_device_policy string2policy(const char *policy)
116 if (g_str_equal(policy, "ignore") == TRUE)
117 return CONNMAN_DEVICE_POLICY_IGNORE;
118 else if (g_str_equal(policy, "off") == TRUE)
119 return CONNMAN_DEVICE_POLICY_OFF;
120 else if (g_str_equal(policy, "auto") == TRUE)
121 return CONNMAN_DEVICE_POLICY_AUTO;
122 else if (g_str_equal(policy, "manual") == TRUE)
123 return CONNMAN_DEVICE_POLICY_MANUAL;
125 return CONNMAN_DEVICE_POLICY_UNKNOWN;
128 static int set_powered(struct connman_device *device, gboolean powered)
130 struct connman_device_driver *driver = device->driver;
133 DBG("device %p powered %d", device, powered);
138 if (powered == TRUE) {
140 err = driver->enable(device);
144 g_hash_table_remove_all(device->networks);
147 err = driver->disable(device);
155 static int set_policy(DBusConnection *connection,
156 struct connman_device *device,
157 enum connman_device_policy policy)
160 DBusMessageIter entry, value;
161 const char *str, *key = "Policy";
164 DBG("device %p policy %d", device, policy);
166 if (device->policy == policy)
170 case CONNMAN_DEVICE_POLICY_UNKNOWN:
172 case CONNMAN_DEVICE_POLICY_IGNORE:
174 case CONNMAN_DEVICE_POLICY_OFF:
175 if (device->powered == TRUE)
176 err = set_powered(device, FALSE);
178 case CONNMAN_DEVICE_POLICY_AUTO:
179 case CONNMAN_DEVICE_POLICY_MANUAL:
180 if (device->powered == FALSE)
181 err = set_powered(device, TRUE);
188 device->policy = policy;
190 signal = dbus_message_new_signal(device->element.path,
191 CONNMAN_DEVICE_INTERFACE, "PropertyChanged");
195 dbus_message_iter_init_append(signal, &entry);
197 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
199 str = policy2string(policy);
201 dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
202 DBUS_TYPE_STRING_AS_STRING, &value);
203 dbus_message_iter_append_basic(&value, DBUS_TYPE_STRING, &str);
204 dbus_message_iter_close_container(&entry, &value);
206 g_dbus_send_message(connection, signal);
211 static void append_networks(struct connman_device *device,
212 DBusMessageIter *entry)
214 DBusMessageIter value, iter;
215 const char *key = "Networks";
217 dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, &key);
219 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
220 DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
223 dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
224 DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
225 __connman_element_list((struct connman_element *) device,
226 CONNMAN_ELEMENT_TYPE_NETWORK, &iter);
227 dbus_message_iter_close_container(&value, &iter);
229 dbus_message_iter_close_container(entry, &value);
232 static DBusMessage *get_properties(DBusConnection *conn,
233 DBusMessage *msg, void *data)
235 struct connman_device *device = data;
237 DBusMessageIter array, dict, entry;
240 DBG("conn %p", conn);
242 reply = dbus_message_new_method_return(msg);
246 dbus_message_iter_init_append(reply, &array);
248 dbus_message_iter_open_container(&array, DBUS_TYPE_ARRAY,
249 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
250 DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
251 DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
253 str = type2description(device->type);
254 if (str != NULL && device->interface != NULL) {
255 char *name = g_strdup_printf("%s (%s)", str, device->interface);
257 connman_dbus_dict_append_variant(&dict, "Name",
258 DBUS_TYPE_STRING, &name);
262 str = type2string(device->type);
264 connman_dbus_dict_append_variant(&dict, "Type",
265 DBUS_TYPE_STRING, &str);
267 if (device->interface != NULL)
268 connman_dbus_dict_append_variant(&dict, "Interface",
269 DBUS_TYPE_STRING, &device->interface);
271 str = policy2string(device->policy);
273 connman_dbus_dict_append_variant(&dict, "Policy",
274 DBUS_TYPE_STRING, &str);
276 connman_dbus_dict_append_variant(&dict, "Powered",
277 DBUS_TYPE_BOOLEAN, &device->powered);
279 if (device->driver && device->driver->scan)
280 connman_dbus_dict_append_variant(&dict, "Scanning",
281 DBUS_TYPE_BOOLEAN, &device->scanning);
283 switch (device->mode) {
284 case CONNMAN_DEVICE_MODE_UNKNOWN:
285 case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
287 case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
288 case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
289 dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY,
291 append_networks(device, &entry);
292 dbus_message_iter_close_container(&dict, &entry);
296 dbus_message_iter_close_container(&array, &dict);
301 static DBusMessage *set_property(DBusConnection *conn,
302 DBusMessage *msg, void *data)
304 struct connman_device *device = data;
305 DBusMessageIter iter, value;
308 DBG("conn %p", conn);
310 if (dbus_message_iter_init(msg, &iter) == FALSE)
311 return __connman_error_invalid_arguments(msg);
313 dbus_message_iter_get_basic(&iter, &name);
314 dbus_message_iter_next(&iter);
315 dbus_message_iter_recurse(&iter, &value);
317 if (__connman_security_check_privileges(msg) < 0)
318 return __connman_error_permission_denied(msg);
320 if (g_str_equal(name, "Powered") == TRUE) {
324 dbus_message_iter_get_basic(&value, &powered);
326 if (device->powered == powered)
327 return __connman_error_invalid_arguments(msg);
329 err = set_powered(device, powered);
330 if (err < 0 && err != -EINPROGRESS)
331 return __connman_error_failed(msg);
332 } else if (g_str_equal(name, "Policy") == TRUE) {
333 enum connman_device_policy policy;
337 dbus_message_iter_get_basic(&value, &str);
338 policy = string2policy(str);
339 if (policy == CONNMAN_DEVICE_POLICY_UNKNOWN)
340 return __connman_error_invalid_arguments(msg);
342 err = set_policy(conn, device, policy);
344 return __connman_error_failed(msg);
347 __connman_element_store(&device->element);
349 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
352 static DBusMessage *create_network(DBusConnection *conn,
353 DBusMessage *msg, void *data)
355 DBG("conn %p", conn);
357 if (__connman_security_check_privileges(msg) < 0)
358 return __connman_error_permission_denied(msg);
360 return __connman_error_invalid_arguments(msg);
363 static DBusMessage *remove_network(DBusConnection *conn,
364 DBusMessage *msg, void *data)
366 DBG("conn %p", conn);
368 if (__connman_security_check_privileges(msg) < 0)
369 return __connman_error_permission_denied(msg);
371 return __connman_error_invalid_arguments(msg);
374 static DBusMessage *propose_scan(DBusConnection *conn,
375 DBusMessage *msg, void *data)
377 struct connman_device *device = data;
380 DBG("conn %p", conn);
382 switch (device->mode) {
383 case CONNMAN_DEVICE_MODE_UNKNOWN:
384 case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
385 return __connman_error_not_supported(msg);
386 case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
387 case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
391 if (!device->driver || !device->driver->scan)
392 return __connman_error_not_supported(msg);
394 err = device->driver->scan(device);
396 return __connman_error_failed(msg);
398 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
401 static GDBusMethodTable device_methods[] = {
402 { "GetProperties", "", "a{sv}", get_properties },
403 { "SetProperty", "sv", "", set_property },
404 { "CreateNetwork", "a{sv}", "o", create_network },
405 { "RemoveNetwork", "o", "", remove_network },
406 { "ProposeScan", "", "", propose_scan },
410 static GDBusSignalTable device_signals[] = {
411 { "PropertyChanged", "sv" },
415 static DBusConnection *connection;
417 static void append_devices(DBusMessageIter *entry)
419 DBusMessageIter value, iter;
420 const char *key = "Devices";
422 dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, &key);
424 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
425 DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
428 dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
429 DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
430 __connman_element_list(NULL, CONNMAN_ELEMENT_TYPE_DEVICE, &iter);
431 dbus_message_iter_close_container(&value, &iter);
433 dbus_message_iter_close_container(entry, &value);
436 static void emit_devices_signal(void)
439 DBusMessageIter entry;
441 signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH,
442 CONNMAN_MANAGER_INTERFACE, "PropertyChanged");
446 dbus_message_iter_init_append(signal, &entry);
448 append_devices(&entry);
450 g_dbus_send_message(connection, signal);
453 static int register_interface(struct connman_element *element)
455 struct connman_device *device = element->device;
457 DBG("element %p name %s", element, element->name);
459 if (g_dbus_register_interface(connection, element->path,
460 CONNMAN_DEVICE_INTERFACE,
461 device_methods, device_signals,
462 NULL, device, NULL) == FALSE) {
463 connman_error("Failed to register %s device", element->path);
467 emit_devices_signal();
472 static void unregister_interface(struct connman_element *element)
474 DBG("element %p name %s", element, element->name);
476 emit_devices_signal();
478 g_dbus_unregister_interface(connection, element->path,
479 CONNMAN_DEVICE_INTERFACE);
482 static void device_enable(struct connman_device *device)
484 DBG("device %p", device);
486 if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE ||
487 device->policy == CONNMAN_DEVICE_POLICY_OFF)
490 if (device->powered == TRUE)
493 if (device->driver->enable)
494 device->driver->enable(device);
497 static void device_disable(struct connman_device *device)
499 DBG("device %p", device);
501 if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE)
504 if (device->powered == FALSE)
507 g_hash_table_remove_all(device->networks);
509 if (device->driver->disable)
510 device->driver->disable(device);
513 static GSList *driver_list = NULL;
515 static gint compare_priority(gconstpointer a, gconstpointer b)
517 const struct connman_device_driver *driver1 = a;
518 const struct connman_device_driver *driver2 = b;
520 return driver2->priority - driver1->priority;
524 * connman_device_driver_register:
525 * @driver: device driver definition
527 * Register a new device driver
529 * Returns: %0 on success
531 int connman_device_driver_register(struct connman_device_driver *driver)
533 DBG("driver %p name %s", driver, driver->name);
535 driver_list = g_slist_insert_sorted(driver_list, driver,
538 //__connman_driver_rescan(&device_driver);
543 static void remove_driver(struct connman_element *element, gpointer user_data)
545 struct connman_device_driver *driver = user_data;
547 DBG("element %p name %s", element, element->name);
549 if (element->device == NULL)
552 if (element->device->driver == driver) {
553 device_disable(element->device);
556 driver->remove(element->device);
558 element->device->driver = NULL;
563 * connman_device_driver_unregister:
564 * @driver: device driver definition
566 * Remove a previously registered device driver
568 void connman_device_driver_unregister(struct connman_device_driver *driver)
570 DBG("driver %p name %s", driver, driver->name);
572 driver_list = g_slist_remove(driver_list, driver);
574 __connman_element_foreach(NULL, CONNMAN_ELEMENT_TYPE_DEVICE,
575 remove_driver, driver);
578 static void unregister_network(gpointer data)
580 struct connman_network *network = data;
582 DBG("network %p", network);
584 connman_element_unregister((struct connman_element *) network);
586 connman_network_unref(network);
589 static void device_destruct(struct connman_element *element)
591 struct connman_device *device = element->device;
593 DBG("element %p name %s", element, element->name);
595 g_free(device->path);
596 g_free(device->interface);
598 g_hash_table_destroy(device->networks);
599 device->networks = NULL;
603 * connman_device_create:
604 * @node: device node name (for example an address)
607 * Allocate a new device of given #type and assign the #node name to it.
609 * Returns: a newly-allocated #connman_device structure
611 struct connman_device *connman_device_create(const char *node,
612 enum connman_device_type type)
614 struct connman_device *device;
616 DBG("node %s type %d", node, type);
618 device = g_try_new0(struct connman_device, 1);
622 DBG("device %p", device);
624 device->element.refcount = 1;
626 device->element.name = g_strdup(node);
627 device->element.type = CONNMAN_ELEMENT_TYPE_DEVICE;
628 device->element.index = -1;
631 case CONNMAN_DEVICE_TYPE_UNKNOWN:
632 case CONNMAN_DEVICE_TYPE_VENDOR:
633 case CONNMAN_DEVICE_TYPE_WIFI:
634 case CONNMAN_DEVICE_TYPE_WIMAX:
635 case CONNMAN_DEVICE_TYPE_BLUETOOTH:
636 case CONNMAN_DEVICE_TYPE_HSO:
637 case CONNMAN_DEVICE_TYPE_NOZOMI:
638 case CONNMAN_DEVICE_TYPE_HUAWEI:
639 case CONNMAN_DEVICE_TYPE_NOVATEL:
640 device->element.subtype = CONNMAN_ELEMENT_SUBTYPE_UNKNOWN;
642 case CONNMAN_DEVICE_TYPE_ETHERNET:
643 device->element.subtype = CONNMAN_ELEMENT_SUBTYPE_ETHERNET;
647 device->element.device = device;
648 device->element.destruct = device_destruct;
651 device->mode = CONNMAN_DEVICE_MODE_UNKNOWN;
652 device->policy = CONNMAN_DEVICE_POLICY_AUTO;
654 device->networks = g_hash_table_new_full(g_str_hash, g_str_equal,
655 g_free, unregister_network);
661 * connman_device_ref:
662 * @device: device structure
664 * Increase reference counter of device
666 struct connman_device *connman_device_ref(struct connman_device *device)
668 if (connman_element_ref(&device->element) == NULL)
675 * connman_device_unref:
676 * @device: device structure
678 * Decrease reference counter of device
680 void connman_device_unref(struct connman_device *device)
682 connman_element_unref(&device->element);
686 * connman_device_set_path:
687 * @device: device structure
690 * Set path name of device
692 void connman_device_set_path(struct connman_device *device, const char *path)
694 g_free(device->element.devpath);
695 device->element.devpath = g_strdup(path);
697 g_free(device->path);
698 device->path = g_strdup(path);
702 * connman_device_get_path:
703 * @device: device structure
705 * Get path name of device
707 const char *connman_device_get_path(struct connman_device *device)
713 * connman_device_set_index:
714 * @device: device structure
715 * @index: index number
717 * Set index number of device
719 void connman_device_set_index(struct connman_device *device, int index)
721 device->element.index = index;
725 * connman_device_get_index:
726 * @device: device structure
728 * Get index number of device
730 int connman_device_get_index(struct connman_device *device)
732 return device->element.index;
736 * connman_device_set_interface:
737 * @device: device structure
738 * @interface: interface name
740 * Set interface name of device
742 void connman_device_set_interface(struct connman_device *device,
743 const char *interface)
745 g_free(device->element.devname);
746 device->element.devname = g_strdup(interface);
748 g_free(device->interface);
749 device->interface = g_strdup(interface);
753 * connman_device_get_interface:
754 * @device: device structure
756 * Get interface name of device
758 const char *connman_device_get_interface(struct connman_device *device)
760 return device->interface;
764 * connman_device_set_policy:
765 * @device: device structure
766 * @policy: power and connection policy
768 * Change power and connection policy of device
770 void connman_device_set_policy(struct connman_device *device,
771 enum connman_device_policy policy)
773 device->policy = policy;
777 * connman_device_set_mode:
778 * @device: device structure
779 * @mode: network mode
781 * Change network mode of device
783 void connman_device_set_mode(struct connman_device *device,
784 enum connman_device_mode mode)
790 * connman_device_set_powered:
791 * @device: device structure
792 * @powered: powered state
794 * Change power state of device
796 int connman_device_set_powered(struct connman_device *device,
797 connman_bool_t powered)
800 DBusMessageIter entry, value;
801 const char *key = "Powered";
803 DBG("driver %p powered %d", device, powered);
805 if (device->powered == powered)
808 device->powered = powered;
810 signal = dbus_message_new_signal(device->element.path,
811 CONNMAN_DEVICE_INTERFACE, "PropertyChanged");
815 dbus_message_iter_init_append(signal, &entry);
817 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
819 dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
820 DBUS_TYPE_BOOLEAN_AS_STRING, &value);
821 dbus_message_iter_append_basic(&value, DBUS_TYPE_BOOLEAN, &powered);
822 dbus_message_iter_close_container(&entry, &value);
824 g_dbus_send_message(connection, signal);
830 * connman_device_set_carrier:
831 * @device: device structure
832 * @carrier: carrier state
834 * Change carrier state of device (only for device without scanning)
836 int connman_device_set_carrier(struct connman_device *device,
837 connman_bool_t carrier)
839 DBG("driver %p carrier %d", device, carrier);
841 switch (device->mode) {
842 case CONNMAN_DEVICE_MODE_UNKNOWN:
843 case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
844 case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
846 case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
850 if (device->carrier == carrier)
853 device->carrier = carrier;
855 if (carrier == TRUE) {
856 struct connman_element *element;
858 element = connman_element_create(NULL);
859 if (element != NULL) {
860 element->type = CONNMAN_ELEMENT_TYPE_DHCP;
861 element->subtype = device->element.subtype;
862 element->index = device->element.index;
864 if (connman_element_register(element,
865 &device->element) < 0)
866 connman_element_unref(element);
869 connman_element_unregister_children(&device->element);
875 * connman_device_set_scanning:
876 * @device: device structure
877 * @scanning: scanning state
879 * Change scanning state of device
881 int connman_device_set_scanning(struct connman_device *device,
882 connman_bool_t scanning)
885 DBusMessageIter entry, value;
886 const char *key = "Scanning";
888 DBG("driver %p scanning %d", device, scanning);
890 if (!device->driver || !device->driver->scan)
893 if (device->scanning == scanning)
896 device->scanning = scanning;
898 signal = dbus_message_new_signal(device->element.path,
899 CONNMAN_DEVICE_INTERFACE, "PropertyChanged");
903 dbus_message_iter_init_append(signal, &entry);
905 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
907 dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
908 DBUS_TYPE_BOOLEAN_AS_STRING, &value);
909 dbus_message_iter_append_basic(&value, DBUS_TYPE_BOOLEAN, &scanning);
910 dbus_message_iter_close_container(&entry, &value);
912 g_dbus_send_message(connection, signal);
918 * connman_device_add_network:
919 * @device: device structure
920 * @network: network structure
922 * Add new network to the device
924 int connman_device_add_network(struct connman_device *device,
925 struct connman_network *network)
927 const char *identifier = connman_network_get_identifier(network);
930 DBG("device %p network %p", device, network);
932 switch (device->mode) {
933 case CONNMAN_DEVICE_MODE_UNKNOWN:
934 case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
936 case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
937 case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
941 __connman_network_set_device(network, device);
943 err = connman_element_register((struct connman_element *) network,
946 __connman_network_set_device(network, NULL);
950 g_hash_table_insert(device->networks, g_strdup(identifier),
957 * connman_device_get_network:
958 * @device: device structure
959 * @identifier: network identifier
961 * Get network for given identifier
963 struct connman_network *connman_device_get_network(struct connman_device *device,
964 const char *identifier)
966 DBG("device %p identifier %s", device, identifier);
968 return g_hash_table_lookup(device->networks, identifier);
972 * connman_device_remove_network:
973 * @device: device structure
974 * @identifier: network identifier
976 * Remove network for given identifier
978 int connman_device_remove_network(struct connman_device *device,
979 const char *identifier)
981 DBG("device %p identifier %s", device, identifier);
983 g_hash_table_remove(device->networks, identifier);
989 * connman_device_register:
990 * @device: device structure
992 * Register device with the system
994 int connman_device_register(struct connman_device *device)
996 return connman_element_register(&device->element, NULL);
1000 * connman_device_unregister:
1001 * @device: device structure
1003 * Unregister device with the system
1005 void connman_device_unregister(struct connman_device *device)
1007 connman_element_unregister(&device->element);
1011 * connman_device_get_data:
1012 * @device: device structure
1014 * Get private device data pointer
1016 void *connman_device_get_data(struct connman_device *device)
1018 return device->driver_data;
1022 * connman_device_set_data:
1023 * @device: device structure
1024 * @data: data pointer
1026 * Set private device data pointer
1028 void connman_device_set_data(struct connman_device *device, void *data)
1030 device->driver_data = data;
1033 static gboolean match_driver(struct connman_device *device,
1034 struct connman_device_driver *driver)
1036 if (device->type == driver->type ||
1037 driver->type == CONNMAN_DEVICE_TYPE_UNKNOWN)
1043 static int device_probe(struct connman_element *element)
1045 struct connman_device *device = element->device;
1049 DBG("element %p name %s", element, element->name);
1054 for (list = driver_list; list; list = list->next) {
1055 struct connman_device_driver *driver = list->data;
1057 if (match_driver(device, driver) == FALSE)
1060 DBG("driver %p name %s", driver, driver->name);
1062 if (driver->probe(device) == 0) {
1063 device->driver = driver;
1068 if (device->driver == NULL)
1071 err = register_interface(element);
1073 if (device->driver->remove)
1074 device->driver->remove(device);
1078 device_enable(device);
1083 static void device_remove(struct connman_element *element)
1085 struct connman_device *device = element->device;
1087 DBG("element %p name %s", element, element->name);
1092 if (device->driver == NULL)
1095 device_disable(device);
1097 unregister_interface(element);
1099 if (device->driver->remove)
1100 device->driver->remove(device);
1103 static struct connman_driver device_driver = {
1105 .type = CONNMAN_ELEMENT_TYPE_DEVICE,
1106 .priority = CONNMAN_DRIVER_PRIORITY_LOW,
1107 .probe = device_probe,
1108 .remove = device_remove,
1111 int __connman_device_init(void)
1115 connection = connman_dbus_get_connection();
1117 return connman_driver_register(&device_driver);
1120 void __connman_device_cleanup(void)
1124 connman_driver_unregister(&device_driver);
1126 dbus_connection_unref(connection);