From 91620bc550205144b793d4f8e7d96f7b9f78e9c6 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sun, 4 Jan 2009 16:14:13 +0100 Subject: [PATCH] Use RTNL newlink watch to reduce code complexity --- plugins/ethernet.c | 86 ++++++++++++++++++------------------------------------ 1 file changed, 28 insertions(+), 58 deletions(-) diff --git a/plugins/ethernet.c b/plugins/ethernet.c index 1ddf1fa..1e797c0 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(ðernet_rtnl); - if (err < 0) - return err; - - err = connman_device_driver_register(ðernet_driver); - if (err < 0) { - connman_rtnl_unregister(ðernet_rtnl); - return err; - } - - return 0; + return connman_device_driver_register(ðernet_driver); } static void ethernet_exit(void) { connman_device_driver_unregister(ðernet_driver); - - connman_rtnl_unregister(ðernet_rtnl); } CONNMAN_PLUGIN_DEFINE(ethernet, "Ethernet interface plugin", VERSION, -- 2.7.4