summaryrefslogtreecommitdiff
path: root/plugins/ethernet.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2009-01-04 16:14:13 +0100
committerMarcel Holtmann <marcel@holtmann.org>2009-01-04 16:14:13 +0100
commit91620bc550205144b793d4f8e7d96f7b9f78e9c6 (patch)
tree028cc5672ef427e01a9ea61899f689251332e6ab /plugins/ethernet.c
parent3ff7262ed26840a697c914a7905543d6c3efac6c (diff)
downloadconnman-91620bc550205144b793d4f8e7d96f7b9f78e9c6.tar.gz
connman-91620bc550205144b793d4f8e7d96f7b9f78e9c6.tar.bz2
connman-91620bc550205144b793d4f8e7d96f7b9f78e9c6.zip
Use RTNL newlink watch to reduce code complexity
Diffstat (limited to 'plugins/ethernet.c')
-rw-r--r--plugins/ethernet.c86
1 files changed, 28 insertions, 58 deletions
diff --git a/plugins/ethernet.c b/plugins/ethernet.c
index 1ddf1fa9..1e797c08 100644
--- a/plugins/ethernet.c
+++ b/plugins/ethernet.c
@@ -45,56 +45,38 @@
struct ethernet_data {
int index;
unsigned flags;
+ unsigned int watch;
};
-static GSList *ethernet_list = NULL;
-
-static void ethernet_newlink(unsigned short type, int index,
- unsigned flags, unsigned change)
+static void ethernet_newlink(unsigned flags, unsigned change, void *user_data)
{
- GSList *list;
-
- DBG("index %d flags %ld change %ld", index, flags, change);
-
- for (list = ethernet_list; list; list = list->next) {
- struct connman_device *device = list->data;
- struct ethernet_data *ethernet;
-
- ethernet = connman_device_get_data(device);
- if (ethernet == NULL)
- continue;
+ struct connman_device *device = user_data;
+ struct ethernet_data *ethernet = connman_device_get_data(device);
- if (ethernet->index != index)
- continue;
+ DBG("index %d flags %ld change %ld", ethernet->index, flags, change);
- if ((ethernet->flags & IFF_UP) != (flags & IFF_UP)) {
- if (flags & IFF_UP) {
- DBG("power on");
- connman_device_set_powered(device, TRUE);
- } else {
- DBG("power off");
- connman_device_set_powered(device, FALSE);
- }
+ if ((ethernet->flags & IFF_UP) != (flags & IFF_UP)) {
+ if (flags & IFF_UP) {
+ DBG("power on");
+ connman_device_set_powered(device, TRUE);
+ } else {
+ DBG("power off");
+ connman_device_set_powered(device, FALSE);
}
+ }
- if ((ethernet->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP)) {
- if (flags & IFF_LOWER_UP) {
- DBG("carrier on");
- connman_device_set_carrier(device, TRUE);
- } else {
- DBG("carrier off");
- connman_device_set_carrier(device, FALSE);
- }
+ if ((ethernet->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP)) {
+ if (flags & IFF_LOWER_UP) {
+ DBG("carrier on");
+ connman_device_set_carrier(device, TRUE);
+ } else {
+ DBG("carrier off");
+ connman_device_set_carrier(device, FALSE);
}
-
- ethernet->flags = flags;
}
-}
-static struct connman_rtnl ethernet_rtnl = {
- .name = "ethernet",
- .newlink = ethernet_newlink,
-};
+ ethernet->flags = flags;
+}
static int ethernet_probe(struct connman_device *device)
{
@@ -106,11 +88,13 @@ static int ethernet_probe(struct connman_device *device)
if (ethernet == NULL)
return -ENOMEM;
- ethernet_list = g_slist_append(ethernet_list, device);
-
connman_device_set_data(device, ethernet);
ethernet->index = connman_device_get_index(device);
+ ethernet->flags = 0;
+
+ ethernet->watch = connman_rtnl_add_newlink_watch(ethernet->index,
+ ethernet_newlink, device);
connman_rtnl_send_getlink();
@@ -125,7 +109,7 @@ static void ethernet_remove(struct connman_device *device)
connman_device_set_data(device, NULL);
- ethernet_list = g_slist_remove(ethernet_list, device);
+ connman_rtnl_remove_watch(ethernet->watch);
g_free(ethernet);
}
@@ -159,26 +143,12 @@ static struct connman_device_driver ethernet_driver = {
static int ethernet_init(void)
{
- int err;
-
- err = connman_rtnl_register(&ethernet_rtnl);
- if (err < 0)
- return err;
-
- err = connman_device_driver_register(&ethernet_driver);
- if (err < 0) {
- connman_rtnl_unregister(&ethernet_rtnl);
- return err;
- }
-
- return 0;
+ return connman_device_driver_register(&ethernet_driver);
}
static void ethernet_exit(void)
{
connman_device_driver_unregister(&ethernet_driver);
-
- connman_rtnl_unregister(&ethernet_rtnl);
}
CONNMAN_PLUGIN_DEFINE(ethernet, "Ethernet interface plugin", VERSION,