X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=plugins%2Fethernet.c;h=301327139f93fd5902a41312338f72cbfa232a5e;hb=419dd8fe0439c9f9d37671fddbe2974c8e1d8daa;hp=1ddf1fa900a42340cdd4bc48c86cb425828f02b1;hpb=991fe1e5f6458aa30ee82ad73b2f0411b74b1d3e;p=connman diff --git a/plugins/ethernet.c b/plugins/ethernet.c index 1ddf1fa..3013271 100644 --- a/plugins/ethernet.c +++ b/plugins/ethernet.c @@ -24,77 +24,56 @@ #endif #include -#include -#include -#include -#include -#include -#include -#include +#include + +#ifndef IFF_LOWER_UP +#define IFF_LOWER_UP 0x10000 +#endif #include #define CONNMAN_API_SUBJECT_TO_CHANGE #include #include +#include #include #include -#include "inet.h" - 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 %d change %d", 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 +85,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 +106,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); } @@ -136,7 +117,7 @@ static int ethernet_enable(struct connman_device *device) DBG("device %p", device); - return inet_ifup(ethernet->index); + return connman_inet_ifup(ethernet->index); } static int ethernet_disable(struct connman_device *device) @@ -145,7 +126,7 @@ static int ethernet_disable(struct connman_device *device) DBG("device %p", device); - return inet_ifdown(ethernet->index); + return connman_inet_ifdown(ethernet->index); } static struct connman_device_driver ethernet_driver = { @@ -159,27 +140,13 @@ 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, - ethernet_init, ethernet_exit) + CONNMAN_PLUGIN_PRIORITY_DEFAULT, ethernet_init, ethernet_exit)