This email list is read-only. Emails sent to this list will be discarded ---------------------------------- plugins/dhclient.c | 15 +++++---- src/detect.c | 3 +- src/device.c | 4 ++ src/network.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++ test/list-networks | 3 +- 5 files changed, 104 insertions(+), 9 deletions(-)
New commits: commit 1c690efa00cb22a07f0472fdd9a93859c2bc18d3 Author: Marcel Holtmann <[email protected]> Date: Sun Dec 28 10:14:25 2008 +0100 Add network driver matching support commit c93def76c9179707bf020ec023fa010ec706984c Author: Marcel Holtmann <[email protected]> Date: Sun Dec 28 10:06:38 2008 +0100 Remove networks when device gets disabled commit a9a626186bf087a4ecf36ca31c473c13df34572d Author: Marcel Holtmann <[email protected]> Date: Sun Dec 28 09:16:52 2008 +0100 Set HSO devices to single network mode commit c2afe171cceb352419c379bc2c713931960a7549 Author: Marcel Holtmann <[email protected]> Date: Sun Dec 28 09:15:43 2008 +0100 Add cellular type to device's network list commit 51e0e521dc0e141716ba1e790ee441df8582655a Author: Marcel Holtmann <[email protected]> Date: Sun Dec 28 08:58:37 2008 +0100 Update D-Bus filter registration and removal Diff in this email is a maximum of 400 lines. diff --git a/plugins/dhclient.c b/plugins/dhclient.c index 2cb4930..04787d1 100644 --- a/plugins/dhclient.c +++ b/plugins/dhclient.c @@ -313,9 +313,11 @@ static DBusHandlerResult dhclient_filter(DBusConnection *conn, static DBusConnection *connection; +static const char *dhclient_rule = "path=" DHCLIENT_PATH + ",interface=" DHCLIENT_INTF; + static int dhclient_init(void) { - gchar *filter; int err; connection = connman_dbus_get_connection(); @@ -325,12 +327,7 @@ static int dhclient_init(void) dbus_connection_add_filter(connection, dhclient_filter, NULL, NULL); - filter = g_strdup_printf("interface=%s,path=%s", - DHCLIENT_INTF, DHCLIENT_PATH); - - dbus_bus_add_match(connection, filter, NULL); - - g_free(filter); + dbus_bus_add_match(connection, dhclient_rule, NULL); err = connman_driver_register(&dhclient_driver); if (err < 0) { @@ -358,6 +355,10 @@ static void dhclient_exit(void) connman_driver_unregister(&dhclient_driver); + dbus_bus_remove_match(connection, dhclient_rule, NULL); + + dbus_connection_remove_filter(connection, dhclient_filter, NULL); + dbus_connection_unref(connection); } diff --git a/src/detect.c b/src/detect.c index c6988df..9ede7db 100644 --- a/src/detect.c +++ b/src/detect.c @@ -200,9 +200,10 @@ static void detect_newlink(unsigned short type, int index, } switch (devtype) { - case CONNMAN_DEVICE_TYPE_BLUETOOTH: case CONNMAN_DEVICE_TYPE_HSO: connman_device_set_policy(device, CONNMAN_DEVICE_POLICY_MANUAL); + connman_device_set_mode(device, + CONNMAN_DEVICE_MODE_SINGLE_NETWORK); break; default: break; diff --git a/src/device.c b/src/device.c index 590b955..e92798e 100644 --- a/src/device.c +++ b/src/device.c @@ -127,6 +127,8 @@ static int set_powered(struct connman_device *device, gboolean powered) else err = -EINVAL; } else { + g_hash_table_remove_all(device->networks); + if (driver->disable) err = driver->disable(device); else @@ -942,6 +944,8 @@ static void device_disable(struct connman_device *device) if (device->powered == FALSE) return; + g_hash_table_remove_all(device->networks); + if (device->driver->disable) device->driver->disable(device); } diff --git a/src/network.c b/src/network.c index cfd3012..3e35a38 100644 --- a/src/network.c +++ b/src/network.c @@ -34,6 +34,47 @@ struct connman_network { void *driver_data; }; +static GSList *driver_list = NULL; + +static gint compare_priority(gconstpointer a, gconstpointer b) +{ + const struct connman_network_driver *driver1 = a; + const struct connman_network_driver *driver2 = b; + + return driver2->priority - driver1->priority; +} + +/** + * connman_network_driver_register: + * @driver: network driver definition + * + * Register a new network driver + * + * Returns: %0 on success + */ +int connman_network_driver_register(struct connman_network_driver *driver) +{ + DBG("driver %p name %s", driver, driver->name); + + driver_list = g_slist_insert_sorted(driver_list, driver, + compare_priority); + + return 0; +} + +/** + * connman_network_driver_unregister: + * @driver: network driver definition + * + * Remove a previously registered network driver + */ +void connman_network_driver_unregister(struct connman_network_driver *driver) +{ + DBG("driver %p name %s", driver, driver->name); + + driver_list = g_slist_remove(driver_list, driver); +} + static void network_destruct(struct connman_element *element) { struct connman_network *network = element->network; @@ -138,13 +179,60 @@ void connman_network_set_data(struct connman_network *network, void *data) network->driver_data = data; } +static gboolean match_driver(struct connman_network *network, + struct connman_network_driver *driver) +{ + if (network->type == driver->type || + driver->type == CONNMAN_NETWORK_TYPE_UNKNOWN) + return TRUE; + + return FALSE; +} + static int network_probe(struct connman_element *element) { + struct connman_network *network = element->network; + GSList *list; + + DBG("element %p name %s", element, element->name); + + if (network == NULL) + return -ENODEV; + + for (list = driver_list; list; list = list->next) { + struct connman_network_driver *driver = list->data; + + if (match_driver(network, driver) == FALSE) + continue; + + DBG("driver %p name %s", driver, driver->name); + + if (driver->probe(network) == 0) { + network->driver = driver; + break; + } + } + + if (!network->driver) + return -ENODEV; + return 0; } static void network_remove(struct connman_element *element) { + struct connman_network *network = element->network; + + DBG("element %p name %s", element, element->name); + + if (network == NULL) + return; + + if (!network->driver) + return; + + if (network->driver->remove) + network->driver->remove(network); } static struct connman_driver network_driver = { diff --git a/test/list-networks b/test/list-networks index d8958fb..8b1ade1 100755 --- a/test/list-networks +++ b/test/list-networks @@ -25,7 +25,8 @@ for path in properties["Devices"]: properties = device.GetProperties() - if properties["Type"] not in ["wifi", "wimax", "bluetooth"]: + if properties["Type"] not in ["wifi", "wimax", + "bluetooth", "cellular"]: continue; print "[ %s ]" % (path) _______________________________________________ Commits mailing list [email protected] https://lists.moblin.org/mailman/listinfo/commits
