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 void device_enable(struct connman_device *device)
480 DBG("device %p", device);
482 if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE ||
483 device->policy == CONNMAN_DEVICE_POLICY_OFF)
486 if (device->powered == TRUE)
489 if (device->driver->enable)
490 device->driver->enable(device);
493 static void device_disable(struct connman_device *device)
495 DBG("device %p", device);
497 if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE)
500 if (device->powered == FALSE)
503 g_hash_table_remove_all(device->networks);
505 if (device->driver->disable)
506 device->driver->disable(device);
509 static GSList *driver_list = NULL;
511 static gint compare_priority(gconstpointer a, gconstpointer b)
513 const struct connman_device_driver *driver1 = a;
514 const struct connman_device_driver *driver2 = b;
516 return driver2->priority - driver1->priority;
520 * connman_device_driver_register:
521 * @driver: device driver definition
523 * Register a new device driver
525 * Returns: %0 on success
527 int connman_device_driver_register(struct connman_device_driver *driver)
529 DBG("driver %p name %s", driver, driver->name);
531 driver_list = g_slist_insert_sorted(driver_list, driver,
534 //__connman_driver_rescan(&device_driver);
539 static void remove_driver(struct connman_element *element, gpointer user_data)
541 struct connman_device_driver *driver = user_data;
543 DBG("element %p name %s", element, element->name);
545 if (element->device == NULL)
548 if (element->device->driver == driver) {
549 device_disable(element->device);
552 driver->remove(element->device);
554 element->device->driver = NULL;
559 * connman_device_driver_unregister:
560 * @driver: device driver definition
562 * Remove a previously registered device driver
564 void connman_device_driver_unregister(struct connman_device_driver *driver)
566 DBG("driver %p name %s", driver, driver->name);
568 driver_list = g_slist_remove(driver_list, driver);
570 __connman_element_foreach(NULL, CONNMAN_ELEMENT_TYPE_DEVICE,
571 remove_driver, driver);
574 static void unregister_network(gpointer data)
576 struct connman_network *network = data;
578 DBG("network %p", network);
580 connman_element_unregister((struct connman_element *) network);
582 connman_network_unref(network);
585 static void device_destruct(struct connman_element *element)
587 struct connman_device *device = element->device;
589 DBG("element %p name %s", element, element->name);
591 g_free(device->path);
592 g_free(device->interface);
594 g_hash_table_destroy(device->networks);
595 device->networks = NULL;
599 * connman_device_create:
600 * @node: device node name (for example an address)
603 * Allocate a new device of given #type and assign the #node name to it.
605 * Returns: a newly-allocated #connman_device structure
607 struct connman_device *connman_device_create(const char *node,
608 enum connman_device_type type)
610 struct connman_device *device;
612 DBG("node %s type %d", node, type);
614 device = g_try_new0(struct connman_device, 1);
618 DBG("device %p", device);
620 device->element.refcount = 1;
622 device->element.name = g_strdup(node);
623 device->element.type = CONNMAN_ELEMENT_TYPE_DEVICE;
624 device->element.index = -1;
627 case CONNMAN_DEVICE_TYPE_UNKNOWN:
628 case CONNMAN_DEVICE_TYPE_VENDOR:
629 case CONNMAN_DEVICE_TYPE_WIFI:
630 case CONNMAN_DEVICE_TYPE_WIMAX:
631 case CONNMAN_DEVICE_TYPE_BLUETOOTH:
632 case CONNMAN_DEVICE_TYPE_HSO:
633 case CONNMAN_DEVICE_TYPE_HUAWEI:
634 device->element.subtype = CONNMAN_ELEMENT_SUBTYPE_UNKNOWN;
636 case CONNMAN_DEVICE_TYPE_ETHERNET:
637 device->element.subtype = CONNMAN_ELEMENT_SUBTYPE_ETHERNET;
641 device->element.device = device;
642 device->element.destruct = device_destruct;
645 device->mode = CONNMAN_DEVICE_MODE_UNKNOWN;
646 device->policy = CONNMAN_DEVICE_POLICY_AUTO;
648 device->networks = g_hash_table_new_full(g_str_hash, g_str_equal,
649 g_free, unregister_network);
655 * connman_device_ref:
656 * @device: device structure
658 * Increase reference counter of device
660 struct connman_device *connman_device_ref(struct connman_device *device)
662 if (connman_element_ref(&device->element) == NULL)
669 * connman_device_unref:
670 * @device: device structure
672 * Decrease reference counter of device
674 void connman_device_unref(struct connman_device *device)
676 connman_element_unref(&device->element);
680 * connman_device_set_path:
681 * @device: device structure
684 * Set path name of device
686 void connman_device_set_path(struct connman_device *device, const char *path)
688 g_free(device->element.devpath);
689 device->element.devpath = g_strdup(path);
691 g_free(device->path);
692 device->path = g_strdup(path);
696 * connman_device_get_path:
697 * @device: device structure
699 * Get path name of device
701 const char *connman_device_get_path(struct connman_device *device)
707 * connman_device_set_index:
708 * @device: device structure
709 * @index: index number
711 * Set index number of device
713 void connman_device_set_index(struct connman_device *device, int index)
715 device->element.index = index;
719 * connman_device_get_index:
720 * @device: device structure
722 * Get index number of device
724 int connman_device_get_index(struct connman_device *device)
726 return device->element.index;
730 * connman_device_set_interface:
731 * @device: device structure
732 * @interface: interface name
734 * Set interface name of device
736 void connman_device_set_interface(struct connman_device *device,
737 const char *interface)
739 g_free(device->element.devname);
740 device->element.devname = g_strdup(interface);
742 g_free(device->interface);
743 device->interface = g_strdup(interface);
747 * connman_device_get_interface:
748 * @device: device structure
750 * Get interface name of device
752 const char *connman_device_get_interface(struct connman_device *device)
754 return device->interface;
758 * connman_device_set_policy:
759 * @device: device structure
760 * @policy: power and connection policy
762 * Change power and connection policy of device
764 void connman_device_set_policy(struct connman_device *device,
765 enum connman_device_policy policy)
767 device->policy = policy;
771 * connman_device_set_mode:
772 * @device: device structure
773 * @mode: network mode
775 * Change network mode of device
777 void connman_device_set_mode(struct connman_device *device,
778 enum connman_device_mode mode)
784 * connman_device_set_powered:
785 * @device: device structure
786 * @powered: powered state
788 * Change power state of device
790 int connman_device_set_powered(struct connman_device *device,
791 connman_bool_t powered)
794 DBusMessageIter entry, value;
795 const char *key = "Powered";
797 DBG("driver %p powered %d", device, powered);
799 if (device->powered == powered)
802 device->powered = powered;
804 signal = dbus_message_new_signal(device->element.path,
805 CONNMAN_DEVICE_INTERFACE, "PropertyChanged");
809 dbus_message_iter_init_append(signal, &entry);
811 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
813 dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
814 DBUS_TYPE_BOOLEAN_AS_STRING, &value);
815 dbus_message_iter_append_basic(&value, DBUS_TYPE_BOOLEAN, &powered);
816 dbus_message_iter_close_container(&entry, &value);
818 g_dbus_send_message(connection, signal);
824 * connman_device_set_carrier:
825 * @device: device structure
826 * @carrier: carrier state
828 * Change carrier state of device (only for device without scanning)
830 int connman_device_set_carrier(struct connman_device *device,
831 connman_bool_t carrier)
833 DBG("driver %p carrier %d", device, carrier);
835 switch (device->mode) {
836 case CONNMAN_DEVICE_MODE_UNKNOWN:
837 case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
838 case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
840 case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
844 if (device->carrier == carrier)
847 device->carrier = carrier;
849 if (carrier == TRUE) {
850 struct connman_element *element;
852 element = connman_element_create(NULL);
853 if (element != NULL) {
854 element->type = CONNMAN_ELEMENT_TYPE_DHCP;
855 element->subtype = device->element.subtype;
856 element->index = device->element.index;
858 if (connman_element_register(element,
859 &device->element) < 0)
860 connman_element_unref(element);
863 connman_element_unregister_children(&device->element);
869 * connman_device_set_scanning:
870 * @device: device structure
871 * @scanning: scanning state
873 * Change scanning state of device
875 int connman_device_set_scanning(struct connman_device *device,
876 connman_bool_t scanning)
879 DBusMessageIter entry, value;
880 const char *key = "Scanning";
882 DBG("driver %p scanning %d", device, scanning);
884 if (!device->driver || !device->driver->scan)
887 if (device->scanning == scanning)
890 device->scanning = scanning;
892 signal = dbus_message_new_signal(device->element.path,
893 CONNMAN_DEVICE_INTERFACE, "PropertyChanged");
897 dbus_message_iter_init_append(signal, &entry);
899 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
901 dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT,
902 DBUS_TYPE_BOOLEAN_AS_STRING, &value);
903 dbus_message_iter_append_basic(&value, DBUS_TYPE_BOOLEAN, &scanning);
904 dbus_message_iter_close_container(&entry, &value);
906 g_dbus_send_message(connection, signal);
912 * connman_device_add_network:
913 * @device: device structure
914 * @network: network structure
916 * Add new network to the device
918 int connman_device_add_network(struct connman_device *device,
919 struct connman_network *network)
921 const char *identifier = connman_network_get_identifier(network);
924 DBG("device %p network %p", device, network);
926 switch (device->mode) {
927 case CONNMAN_DEVICE_MODE_UNKNOWN:
928 case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
930 case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
931 case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
935 __connman_network_set_device(network, device);
937 err = connman_element_register((struct connman_element *) network,
940 __connman_network_set_device(network, NULL);
944 g_hash_table_insert(device->networks, g_strdup(identifier),
951 * connman_device_get_network:
952 * @device: device structure
953 * @identifier: network identifier
955 * Get network for given identifier
957 struct connman_network *connman_device_get_network(struct connman_device *device,
958 const char *identifier)
960 DBG("device %p identifier %s", device, identifier);
962 return g_hash_table_lookup(device->networks, identifier);
966 * connman_device_remove_network:
967 * @device: device structure
968 * @identifier: network identifier
970 * Remove network for given identifier
972 int connman_device_remove_network(struct connman_device *device,
973 const char *identifier)
975 DBG("device %p identifier %s", device, identifier);
977 g_hash_table_remove(device->networks, identifier);
983 * connman_device_register:
984 * @device: device structure
986 * Register device with the system
988 int connman_device_register(struct connman_device *device)
990 return connman_element_register(&device->element, NULL);
994 * connman_device_unregister:
995 * @device: device structure
997 * Unregister device with the system
999 void connman_device_unregister(struct connman_device *device)
1001 connman_element_unregister(&device->element);
1005 * connman_device_get_data:
1006 * @device: device structure
1008 * Get private device data pointer
1010 void *connman_device_get_data(struct connman_device *device)
1012 return device->driver_data;
1016 * connman_device_set_data:
1017 * @device: device structure
1018 * @data: data pointer
1020 * Set private device data pointer
1022 void connman_device_set_data(struct connman_device *device, void *data)
1024 device->driver_data = data;
1027 static gboolean match_driver(struct connman_device *device,
1028 struct connman_device_driver *driver)
1030 if (device->type == driver->type ||
1031 driver->type == CONNMAN_DEVICE_TYPE_UNKNOWN)
1037 static int device_probe(struct connman_element *element)
1039 struct connman_device *device = element->device;
1043 DBG("element %p name %s", element, element->name);
1048 for (list = driver_list; list; list = list->next) {
1049 struct connman_device_driver *driver = list->data;
1051 if (match_driver(device, driver) == FALSE)
1054 DBG("driver %p name %s", driver, driver->name);
1056 if (driver->probe(device) == 0) {
1057 device->driver = driver;
1062 if (device->driver == NULL)
1065 err = register_interface(element);
1067 if (device->driver->remove)
1068 device->driver->remove(device);
1072 device_enable(device);
1077 static void device_remove(struct connman_element *element)
1079 struct connman_device *device = element->device;
1081 DBG("element %p name %s", element, element->name);
1086 if (device->driver == NULL)
1089 device_disable(device);
1091 unregister_interface(element);
1093 if (device->driver->remove)
1094 device->driver->remove(device);
1097 static struct connman_driver device_driver = {
1099 .type = CONNMAN_ELEMENT_TYPE_DEVICE,
1100 .priority = CONNMAN_DRIVER_PRIORITY_LOW,
1101 .probe = device_probe,
1102 .remove = device_remove,
1105 int __connman_device_init(void)
1109 connection = connman_dbus_get_connection();
1111 return connman_driver_register(&device_driver);
1114 void __connman_device_cleanup(void)
1118 connman_driver_unregister(&device_driver);
1120 dbus_connection_unref(connection);