diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-01-04 16:14:13 +0100 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-01-04 16:14:13 +0100 |
commit | 91620bc550205144b793d4f8e7d96f7b9f78e9c6 (patch) | |
tree | 028cc5672ef427e01a9ea61899f689251332e6ab /plugins/ethernet.c | |
parent | 3ff7262ed26840a697c914a7905543d6c3efac6c (diff) | |
download | connman-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.c | 86 |
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(ð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, |