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_HUAWEI:
70 static const char *type2string(enum connman_device_type type)
73 case CONNMAN_DEVICE_TYPE_UNKNOWN:
74 case CONNMAN_DEVICE_TYPE_VENDOR:
76 case CONNMAN_DEVICE_TYPE_ETHERNET:
78 case CONNMAN_DEVICE_TYPE_WIFI:
80 case CONNMAN_DEVICE_TYPE_WIMAX:
82 case CONNMAN_DEVICE_TYPE_BLUETOOTH:
84 case CONNMAN_DEVICE_TYPE_HSO:
85 case CONNMAN_DEVICE_TYPE_HUAWEI:
92 static const char *policy2string(enum connman_device_policy policy)
95 case CONNMAN_DEVICE_POLICY_UNKNOWN:
97 case CONNMAN_DEVICE_POLICY_IGNORE:
99 case CONNMAN_DEVICE_POLICY_OFF:
101 case CONNMAN_DEVICE_POLICY_AUTO:
103 case CONNMAN_DEVICE_POLICY_MANUAL:
110 static enum connman_device_policy string2policy(const char *policy)
112 if (g_str_equal(policy, "ignore") == TRUE)
113 return CONNMAN_DEVICE_POLICY_IGNORE;
114 else if (g_str_equal(policy, "off") == TRUE)
115 return CONNMAN_DEVICE_POLICY_OFF;
116 else if (g_str_equal(policy, "auto") == TRUE)
117 return CONNMAN_DEVICE_POLICY_AUTO;
118 else if (g_str_equal(policy, "manual") == TRUE)
119 return CONNMAN_DEVICE_POLICY_MANUAL;
121 return CONNMAN_DEVICE_POLICY_UNKNOWN;
124 static int set_powered(struct connman_device *device, gboolean powered)
126 struct connman_device_driver *driver = device->driver;
129 DBG("device %p powered %d", device, powered);
134 if (powered == TRUE) {
136 err = driver->enable(device);
140 g_hash_table_remove_all(device->networks);
143 err = driver->disable(device);
151 static int set_policy(DBusConnection *connection,
152 struct connman_device *device,
153 enum connman_device_policy policy)
156 DBusMessageIter entry, value;
157 const char *str, *key = "Policy";
160 DBG("device %p policy %d", device, policy);
162 if (device->policy == policy)
166 case CONNMAN_DEVICE_POLICY_UNKNOWN:
168 case CONNMAN_DEVICE_POLICY_IGNORE:
170 case CONNMAN_DEVICE_POLICY_OFF:
171 if (device->powered == TRUE)
172 err = set_powered(device, FALSE);
174 case CONNMAN_DEVICE_POLICY_AUTO:
175 case CONNMAN_DEVICE_POLICY_MANUAL:
176 if (device->powered == FALSE)
177 err = set_powered(device, TRUE);
184 device->policy = policy;
186 signal = dbus_message_new_signal(device->element.path,
187 CONNMAN_DEVICE_INTERFACE, "PropertyChanged");
191 dbus_message_iter_init_append(signal, &entry);
193 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
195 str = policy2string(policy);
197 dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
198 DBUS_TYPE_STRING_AS_STRING, &value);
199 dbus_message_iter_append_basic(&value, DBUS_TYPE_STRING, &str);
200 dbus_message_iter_close_container(&entry, &value);
202 g_dbus_send_message(connection, signal);
207 static void append_networks(struct connman_device *device,
208 DBusMessageIter *entry)
210 DBusMessageIter value, iter;
211 const char *key = "Networks";
213 dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, &key);
215 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
216 DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
219 dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
220 DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
221 __connman_element_list((struct connman_element *) device,
222 CONNMAN_ELEMENT_TYPE_NETWORK, &iter);
223 dbus_message_iter_close_container(&value, &iter);
225 dbus_message_iter_close_container(entry, &value);
228 static DBusMessage *get_properties(DBusConnection *conn,
229 DBusMessage *msg, void *data)
231 struct connman_device *device = data;
233 DBusMessageIter array, dict, entry;
236 DBG("conn %p", conn);
238 reply = dbus_message_new_method_return(msg);
242 dbus_message_iter_init_append(reply, &array);
244 dbus_message_iter_open_container(&array, DBUS_TYPE_ARRAY,
245 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
246 DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
247 DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
249 str = type2description(device->type);
250 if (str != NULL && device->interface != NULL) {
251 char *name = g_strdup_printf("%s (%s)", str, device->interface);
253 connman_dbus_dict_append_variant(&dict, "Name",
254 DBUS_TYPE_STRING, &name);
258 str = type2string(device->type);
260 connman_dbus_dict_append_variant(&dict, "Type",
261 DBUS_TYPE_STRING, &str);
263 if (device->interface != NULL)
264 connman_dbus_dict_append_variant(&dict, "Interface",
265 DBUS_TYPE_STRING, &device->interface);
267 str = policy2string(device->policy);
269 connman_dbus_dict_append_variant(&dict, "Policy",
270 DBUS_TYPE_STRING, &str);
272 connman_dbus_dict_append_variant(&dict, "Powered",
273 DBUS_TYPE_BOOLEAN, &device->powered);
275 if (device->driver && device->driver->scan)
276 connman_dbus_dict_append_variant(&dict, "Scanning",
277 DBUS_TYPE_BOOLEAN, &device->scanning);
279 switch (device->mode) {
280 case CONNMAN_DEVICE_MODE_UNKNOWN:
281 case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
283 case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
284 case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
285 dbus_message_iter_open_container(&dict, DBUS_TYPE_DICT_ENTRY,
287 append_networks(device, &entry);
288 dbus_message_iter_close_container(&dict, &entry);
292 dbus_message_iter_close_container(&array, &dict);
297 static DBusMessage *set_property(DBusConnection *conn,
298 DBusMessage *msg, void *data)
300 struct connman_device *device = data;
301 DBusMessageIter iter, value;
304 DBG("conn %p", conn);
306 if (dbus_message_iter_init(msg, &iter) == FALSE)
307 return __connman_error_invalid_arguments(msg);
309 dbus_message_iter_get_basic(&iter, &name);
310 dbus_message_iter_next(&iter);
311 dbus_message_iter_recurse(&iter, &value);
313 if (__connman_security_check_privileges(msg) < 0)
314 return __connman_error_permission_denied(msg);
316 if (g_str_equal(name, "Powered") == TRUE) {
320 dbus_message_iter_get_basic(&value, &powered);
322 if (device->powered == powered)
323 return __connman_error_invalid_arguments(msg);
325 err = set_powered(device, powered);
326 if (err < 0 && err != -EINPROGRESS)
327 return __connman_error_failed(msg);
328 } else if (g_str_equal(name, "Policy") == TRUE) {
329 enum connman_device_policy policy;
333 dbus_message_iter_get_basic(&value, &str);
334 policy = string2policy(str);
335 if (policy == CONNMAN_DEVICE_POLICY_UNKNOWN)
336 return __connman_error_invalid_arguments(msg);
338 err = set_policy(conn, device, policy);
340 return __connman_error_failed(msg);
343 __connman_element_store(&device->element);
345 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
348 static DBusMessage *create_network(DBusConnection *conn,
349 DBusMessage *msg, void *data)
351 DBG("conn %p", conn);
353 if (__connman_security_check_privileges(msg) < 0)
354 return __connman_error_permission_denied(msg);
356 return __connman_error_invalid_arguments(msg);
359 static DBusMessage *remove_network(DBusConnection *conn,
360 DBusMessage *msg, void *data)
362 DBG("conn %p", conn);
364 if (__connman_security_check_privileges(msg) < 0)
365 return __connman_error_permission_denied(msg);
367 return __connman_error_invalid_arguments(msg);
370 static DBusMessage *propose_scan(DBusConnection *conn,
371 DBusMessage *msg, void *data)
373 struct connman_device *device = data;
376 DBG("conn %p", conn);
378 switch (device->mode) {
379 case CONNMAN_DEVICE_MODE_UNKNOWN:
380 case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
381 return __connman_error_not_supported(msg);
382 case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
383 case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
387 if (!device->driver || !device->driver->scan)
388 return __connman_error_not_supported(msg);
390 err = device->driver->scan(device);
392 return __connman_error_failed(msg);
394 return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
397 static GDBusMethodTable device_methods[] = {
398 { "GetProperties", "", "a{sv}", get_properties },
399 { "SetProperty", "sv", "", set_property },
400 { "CreateNetwork", "a{sv}", "o", create_network },
401 { "RemoveNetwork", "o", "", remove_network },
402 { "ProposeScan", "", "", propose_scan },
406 static GDBusSignalTable device_signals[] = {
407 { "PropertyChanged", "sv" },
411 static DBusConnection *connection;
413 static void append_devices(DBusMessageIter *entry)
415 DBusMessageIter value, iter;
416 const char *key = "Devices";
418 dbus_message_iter_append_basic(entry, DBUS_TYPE_STRING, &key);
420 dbus_message_iter_open_container(entry, DBUS_TYPE_VARIANT,
421 DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
424 dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
425 DBUS_TYPE_OBJECT_PATH_AS_STRING, &iter);
426 __connman_element_list(NULL, CONNMAN_ELEMENT_TYPE_DEVICE, &iter);
427 dbus_message_iter_close_container(&value, &iter);
429 dbus_message_iter_close_container(entry, &value);
432 static void emit_devices_signal(void)
435 DBusMessageIter entry;
437 signal = dbus_message_new_signal(CONNMAN_MANAGER_PATH,
438 CONNMAN_MANAGER_INTERFACE, "PropertyChanged");
442 dbus_message_iter_init_append(signal, &entry);
444 append_devices(&entry);
446 g_dbus_send_message(connection, signal);
449 static int register_interface(struct connman_element *element)
451 struct connman_device *device = element->device;
453 DBG("element %p name %s", element, element->name);
455 if (g_dbus_register_interface(connection, element->path,
456 CONNMAN_DEVICE_INTERFACE,
457 device_methods, device_signals,
458 NULL, device, NULL) == FALSE) {
459 connman_error("Failed to register %s device", element->path);
463 emit_devices_signal();
468 static void unregister_interface(struct connman_element *element)
470 DBG("element %p name %s", element, element->name);
472 emit_devices_signal();
474 g_dbus_unregister_interface(connection, element->path,
475 CONNMAN_DEVICE_INTERFACE);
478 static GSList *driver_list = NULL;
480 static gint compare_priority(gconstpointer a, gconstpointer b)
482 const struct connman_device_driver *driver1 = a;
483 const struct connman_device_driver *driver2 = b;
485 return driver2->priority - driver1->priority;
489 * connman_device_driver_register:
490 * @driver: device driver definition
492 * Register a new device driver
494 * Returns: %0 on success
496 int connman_device_driver_register(struct connman_device_driver *driver)
498 DBG("driver %p name %s", driver, driver->name);
500 driver_list = g_slist_insert_sorted(driver_list, driver,
503 //__connman_driver_rescan(&device_driver);
509 * connman_device_driver_unregister:
510 * @driver: device driver definition
512 * Remove a previously registered device driver
514 void connman_device_driver_unregister(struct connman_device_driver *driver)
516 DBG("driver %p name %s", driver, driver->name);
518 driver_list = g_slist_remove(driver_list, driver);
521 static void unregister_network(gpointer data)
523 struct connman_network *network = data;
525 DBG("network %p", network);
527 connman_element_unregister((struct connman_element *) network);
529 connman_network_unref(network);
532 static void device_destruct(struct connman_element *element)
534 struct connman_device *device = element->device;
536 DBG("element %p name %s", element, element->name);
538 g_free(device->path);
539 g_free(device->interface);
541 g_hash_table_destroy(device->networks);
545 * connman_device_create:
546 * @node: device node name (for example an address)
549 * Allocate a new device of given #type and assign the #node name to it.
551 * Returns: a newly-allocated #connman_device structure
553 struct connman_device *connman_device_create(const char *node,
554 enum connman_device_type type)
556 struct connman_device *device;
558 DBG("node %s type %d", node, type);
560 device = g_try_new0(struct connman_device, 1);
564 DBG("device %p", device);
566 device->element.refcount = 1;
568 device->element.name = g_strdup(node);
569 device->element.type = CONNMAN_ELEMENT_TYPE_DEVICE;
570 device->element.index = -1;
573 case CONNMAN_DEVICE_TYPE_UNKNOWN:
574 case CONNMAN_DEVICE_TYPE_VENDOR:
575 case CONNMAN_DEVICE_TYPE_WIFI:
576 case CONNMAN_DEVICE_TYPE_WIMAX:
577 case CONNMAN_DEVICE_TYPE_BLUETOOTH:
578 case CONNMAN_DEVICE_TYPE_HSO:
579 case CONNMAN_DEVICE_TYPE_HUAWEI:
580 device->element.subtype = CONNMAN_ELEMENT_SUBTYPE_UNKNOWN;
582 case CONNMAN_DEVICE_TYPE_ETHERNET:
583 device->element.subtype = CONNMAN_ELEMENT_SUBTYPE_ETHERNET;
587 device->element.device = device;
588 device->element.destruct = device_destruct;
591 device->mode = CONNMAN_DEVICE_MODE_UNKNOWN;
592 device->policy = CONNMAN_DEVICE_POLICY_AUTO;
594 device->networks = g_hash_table_new_full(g_str_hash, g_str_equal,
595 g_free, unregister_network);
601 * connman_device_ref:
602 * @device: device structure
604 * Increase reference counter of device
606 struct connman_device *connman_device_ref(struct connman_device *device)
608 if (connman_element_ref(&device->element) == NULL)
615 * connman_device_unref:
616 * @device: device structure
618 * Decrease reference counter of device
620 void connman_device_unref(struct connman_device *device)
622 connman_element_unref(&device->element);
626 * connman_device_set_path:
627 * @device: device structure
630 * Set path name of device
632 void connman_device_set_path(struct connman_device *device, const char *path)
634 g_free(device->element.devpath);
635 device->element.devpath = g_strdup(path);
637 g_free(device->path);
638 device->path = g_strdup(path);
642 * connman_device_get_path:
643 * @device: device structure
645 * Get path name of device
647 const char *connman_device_get_path(struct connman_device *device)
653 * connman_device_set_index:
654 * @device: device structure
655 * @index: index number
657 * Set index number of device
659 void connman_device_set_index(struct connman_device *device, int index)
661 device->element.index = index;
665 * connman_device_get_index:
666 * @device: device structure
668 * Get index number of device
670 int connman_device_get_index(struct connman_device *device)
672 return device->element.index;
676 * connman_device_set_interface:
677 * @device: device structure
678 * @interface: interface name
680 * Set interface name of device
682 void connman_device_set_interface(struct connman_device *device,
683 const char *interface)
685 g_free(device->element.devname);
686 device->element.devname = g_strdup(interface);
688 g_free(device->interface);
689 device->interface = g_strdup(interface);
693 * connman_device_get_interface:
694 * @device: device structure
696 * Get interface name of device
698 const char *connman_device_get_interface(struct connman_device *device)
700 return device->interface;
704 * connman_device_set_policy:
705 * @device: device structure
706 * @policy: power and connection policy
708 * Change power and connection policy of device
710 void connman_device_set_policy(struct connman_device *device,
711 enum connman_device_policy policy)
713 device->policy = policy;
717 * connman_device_set_mode:
718 * @device: device structure
719 * @mode: network mode
721 * Change network mode of device
723 void connman_device_set_mode(struct connman_device *device,
724 enum connman_device_mode mode)
730 * connman_device_set_powered:
731 * @device: device structure
732 * @powered: powered state
734 * Change power state of device
736 int connman_device_set_powered(struct connman_device *device,
737 connman_bool_t powered)
740 DBusMessageIter entry, value;
741 const char *key = "Powered";
743 DBG("driver %p powered %d", device, powered);
745 if (device->powered == powered)
748 device->powered = powered;
750 signal = dbus_message_new_signal(device->element.path,
751 CONNMAN_DEVICE_INTERFACE, "PropertyChanged");
755 dbus_message_iter_init_append(signal, &entry);
757 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
759 dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
760 DBUS_TYPE_BOOLEAN_AS_STRING, &value);
761 dbus_message_iter_append_basic(&value, DBUS_TYPE_BOOLEAN, &powered);
762 dbus_message_iter_close_container(&entry, &value);
764 g_dbus_send_message(connection, signal);
770 * connman_device_set_carrier:
771 * @device: device structure
772 * @carrier: carrier state
774 * Change carrier state of device (only for device without scanning)
776 int connman_device_set_carrier(struct connman_device *device,
777 connman_bool_t carrier)
779 DBG("driver %p carrier %d", device, carrier);
781 switch (device->mode) {
782 case CONNMAN_DEVICE_MODE_UNKNOWN:
783 case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
784 case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
786 case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
790 if (device->carrier == carrier)
793 device->carrier = carrier;
795 if (carrier == TRUE) {
796 struct connman_element *element;
798 element = connman_element_create(NULL);
799 if (element != NULL) {
800 element->type = CONNMAN_ELEMENT_TYPE_DHCP;
801 element->subtype = device->element.subtype;
802 element->index = device->element.index;
804 if (connman_element_register(element,
805 &device->element) < 0)
806 connman_element_unref(element);
809 connman_element_unregister_children(&device->element);
815 * connman_device_set_scanning:
816 * @device: device structure
817 * @scanning: scanning state
819 * Change scanning state of device
821 int connman_device_set_scanning(struct connman_device *device,
822 connman_bool_t scanning)
825 DBusMessageIter entry, value;
826 const char *key = "Scanning";
828 DBG("driver %p scanning %d", device, scanning);
830 if (!device->driver || !device->driver->scan)
833 if (device->scanning == scanning)
836 device->scanning = scanning;
838 signal = dbus_message_new_signal(device->element.path,
839 CONNMAN_DEVICE_INTERFACE, "PropertyChanged");
843 dbus_message_iter_init_append(signal, &entry);
845 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
847 dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
848 DBUS_TYPE_BOOLEAN_AS_STRING, &value);
849 dbus_message_iter_append_basic(&value, DBUS_TYPE_BOOLEAN, &scanning);
850 dbus_message_iter_close_container(&entry, &value);
852 g_dbus_send_message(connection, signal);
858 * connman_device_add_network:
859 * @device: device structure
860 * @network: network structure
862 * Add new network to the device
864 int connman_device_add_network(struct connman_device *device,
865 struct connman_network *network)
867 const char *identifier = connman_network_get_identifier(network);
870 DBG("device %p network %p", device, network);
872 switch (device->mode) {
873 case CONNMAN_DEVICE_MODE_UNKNOWN:
874 case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
876 case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
877 case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
881 __connman_network_set_device(network, device);
883 err = connman_element_register((struct connman_element *) network,
886 __connman_network_set_device(network, NULL);
890 g_hash_table_insert(device->networks, g_strdup(identifier),
897 * connman_device_get_network:
898 * @device: device structure
899 * @identifier: network identifier
901 * Get network for given identifier
903 struct connman_network *connman_device_get_network(struct connman_device *device,
904 const char *identifier)
906 DBG("device %p identifier %s", device, identifier);
908 return g_hash_table_lookup(device->networks, identifier);
912 * connman_device_remove_network:
913 * @device: device structure
914 * @identifier: network identifier
916 * Remove network for given identifier
918 int connman_device_remove_network(struct connman_device *device,
919 const char *identifier)
921 DBG("device %p identifier %s", device, identifier);
923 g_hash_table_remove(device->networks, identifier);
929 * connman_device_register:
930 * @device: device structure
932 * Register device with the system
934 int connman_device_register(struct connman_device *device)
936 return connman_element_register(&device->element, NULL);
940 * connman_device_unregister:
941 * @device: device structure
943 * Unregister device with the system
945 void connman_device_unregister(struct connman_device *device)
947 connman_element_unregister(&device->element);
951 * connman_device_get_data:
952 * @device: device structure
954 * Get private device data pointer
956 void *connman_device_get_data(struct connman_device *device)
958 return device->driver_data;
962 * connman_device_set_data:
963 * @device: device structure
964 * @data: data pointer
966 * Set private device data pointer
968 void connman_device_set_data(struct connman_device *device, void *data)
970 device->driver_data = data;
973 static void device_enable(struct connman_device *device)
975 DBG("device %p", device);
977 if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE ||
978 device->policy == CONNMAN_DEVICE_POLICY_OFF)
981 if (device->powered == TRUE)
984 if (device->driver->enable)
985 device->driver->enable(device);
988 static void device_disable(struct connman_device *device)
990 DBG("device %p", device);
992 if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE)
995 if (device->powered == FALSE)
998 g_hash_table_remove_all(device->networks);
1000 if (device->driver->disable)
1001 device->driver->disable(device);
1004 static gboolean match_driver(struct connman_device *device,
1005 struct connman_device_driver *driver)
1007 if (device->type == driver->type ||
1008 driver->type == CONNMAN_DEVICE_TYPE_UNKNOWN)
1014 static int device_probe(struct connman_element *element)
1016 struct connman_device *device = element->device;
1020 DBG("element %p name %s", element, element->name);
1025 for (list = driver_list; list; list = list->next) {
1026 struct connman_device_driver *driver = list->data;
1028 if (match_driver(device, driver) == FALSE)
1031 DBG("driver %p name %s", driver, driver->name);
1033 if (driver->probe(device) == 0) {
1034 device->driver = driver;
1039 if (device->driver == NULL)
1042 err = register_interface(element);
1044 if (device->driver->remove)
1045 device->driver->remove(device);
1049 device_enable(device);
1054 static void device_remove(struct connman_element *element)
1056 struct connman_device *device = element->device;
1058 DBG("element %p name %s", element, element->name);
1063 if (device->driver == NULL)
1066 device_disable(device);
1068 unregister_interface(element);
1070 if (device->driver->remove)
1071 device->driver->remove(device);
1074 static struct connman_driver device_driver = {
1076 .type = CONNMAN_ELEMENT_TYPE_DEVICE,
1077 .priority = CONNMAN_DRIVER_PRIORITY_LOW,
1078 .probe = device_probe,
1079 .remove = device_remove,
1082 int __connman_device_init(void)
1086 connection = connman_dbus_get_connection();
1088 return connman_driver_register(&device_driver);
1091 void __connman_device_cleanup(void)
1095 connman_driver_unregister(&device_driver);
1097 dbus_connection_unref(connection);