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

Reply via email to