X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=plugins%2Fethernet.c;h=301327139f93fd5902a41312338f72cbfa232a5e;hb=dff21f406ed634aa27b83a4e404c1a09b9b953ae;hp=f171348b2992030b08587d475f15dc06ab456d75;hpb=b6997d2f97406ca50ad536be16e09bb68dbd1ed4;p=connman diff --git a/plugins/ethernet.c b/plugins/ethernet.c index f171348..3013271 100644 --- a/plugins/ethernet.c +++ b/plugins/ethernet.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2007-2008 Intel Corporation. All rights reserved. + * Copyright (C) 2007-2009 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -23,234 +23,130 @@ #include #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 struct ethernet_data { int index; - short flags; + unsigned flags; + unsigned int watch; }; -static GStaticMutex ethernet_mutex = G_STATIC_MUTEX_INIT; -static GSList *ethernet_list = NULL; - -static void ethernet_link_flags(int index, short flags) +static void ethernet_newlink(unsigned flags, unsigned change, void *user_data) { - GSList *list; - - g_static_mutex_lock(ðernet_mutex); - - for (list = ethernet_list; list; list = list->next) { - struct connman_element *element = list->data; - struct connman_element *netdev; - struct ethernet_data *ethernet; - - ethernet = connman_element_get_data(element); - if (ethernet == NULL) - continue; - - if (ethernet->index != index) - continue; + struct connman_device *device = user_data; + struct ethernet_data *ethernet = connman_device_get_data(device); - if ((ethernet->flags & IFF_RUNNING) == (flags & IFF_RUNNING)) - continue; + DBG("index %d flags %d change %d", ethernet->index, flags, change); - ethernet->flags = flags; + 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_RUNNING) { + if ((ethernet->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP)) { + if (flags & IFF_LOWER_UP) { DBG("carrier on"); - - netdev = connman_element_create(NULL); - if (netdev != NULL) { - netdev->type = CONNMAN_ELEMENT_TYPE_DEVICE; - netdev->subtype = CONNMAN_ELEMENT_SUBTYPE_NETWORK; - netdev->index = element->index; - - connman_element_register(netdev, element); - } + connman_device_set_carrier(device, TRUE); } else { DBG("carrier off"); - - connman_element_unregister_children(element); + connman_device_set_carrier(device, FALSE); } } - g_static_mutex_unlock(ðernet_mutex); + ethernet->flags = flags; } -static struct connman_rtnl ethernet_rtnl = { - .name = "ethernet", - .link_flags = ethernet_link_flags, -}; - -static int iface_up(struct ethernet_data *ethernet) +static int ethernet_probe(struct connman_device *device) { - struct ifreq ifr; - int sk, err; - - DBG("index %d flags %d", ethernet->index, ethernet->flags); - - sk = socket(PF_INET, SOCK_DGRAM, 0); - if (sk < 0) - return -errno; - - memset(&ifr, 0, sizeof(ifr)); - ifr.ifr_ifindex = ethernet->index; - - if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) { - err = -errno; - goto done; - } + struct ethernet_data *ethernet; - if (ioctl(sk, SIOCGIFFLAGS, &ifr) < 0) { - err = -errno; - goto done; - } + DBG("device %p", device); - if (ifr.ifr_flags & IFF_UP) { - err = -EALREADY; - goto done; - } + ethernet = g_try_new0(struct ethernet_data, 1); + if (ethernet == NULL) + return -ENOMEM; - ifr.ifr_flags |= IFF_UP; + connman_device_set_data(device, ethernet); - if (ioctl(sk, SIOCSIFFLAGS, &ifr) < 0) { - err = -errno; - goto done; - } + ethernet->index = connman_device_get_index(device); + ethernet->flags = 0; - err = 0; + ethernet->watch = connman_rtnl_add_newlink_watch(ethernet->index, + ethernet_newlink, device); -done: - close(sk); + connman_rtnl_send_getlink(); - return err; + return 0; } -static int iface_down(struct ethernet_data *ethernet) +static void ethernet_remove(struct connman_device *device) { - struct ifreq ifr; - int sk, err; + struct ethernet_data *ethernet = connman_device_get_data(device); - DBG("index %d flags %d", ethernet->index, ethernet->flags); + DBG("device %p", device); - sk = socket(PF_INET, SOCK_DGRAM, 0); - if (sk < 0) - return -errno; + connman_device_set_data(device, NULL); - memset(&ifr, 0, sizeof(ifr)); - ifr.ifr_ifindex = ethernet->index; + connman_rtnl_remove_watch(ethernet->watch); - if (ioctl(sk, SIOCGIFNAME, &ifr) < 0) { - err = -errno; - goto done; - } - - if (ioctl(sk, SIOCGIFFLAGS, &ifr) < 0) { - err = -errno; - goto done; - } - - if (!(ifr.ifr_flags & IFF_UP)) { - err = -EALREADY; - goto done; - } - - ifr.ifr_flags &= ~IFF_UP; - - if (ioctl(sk, SIOCSIFFLAGS, &ifr) < 0) - err = -errno; - else - err = 0; - -done: - close(sk); - - return err; + g_free(ethernet); } -static int ethernet_probe(struct connman_element *element) +static int ethernet_enable(struct connman_device *device) { - struct ethernet_data *ethernet; - - DBG("element %p name %s", element, element->name); - - ethernet = g_try_new0(struct ethernet_data, 1); - if (ethernet == NULL) - return -ENOMEM; - - g_static_mutex_lock(ðernet_mutex); - ethernet_list = g_slist_append(ethernet_list, element); - g_static_mutex_unlock(ðernet_mutex); + struct ethernet_data *ethernet = connman_device_get_data(device); - connman_element_set_data(element, ethernet); + DBG("device %p", device); - ethernet->index = element->index; - - iface_up(ethernet); - - connman_rtnl_send_getlink(); - - return 0; + return connman_inet_ifup(ethernet->index); } -static void ethernet_remove(struct connman_element *element) +static int ethernet_disable(struct connman_device *device) { - struct ethernet_data *ethernet = connman_element_get_data(element); - - DBG("element %p name %s", element, element->name); - - connman_element_set_data(element, NULL); - - iface_down(ethernet); + struct ethernet_data *ethernet = connman_device_get_data(device); - g_static_mutex_lock(ðernet_mutex); - ethernet_list = g_slist_remove(ethernet_list, element); - g_static_mutex_unlock(ðernet_mutex); + DBG("device %p", device); - g_free(ethernet); + return connman_inet_ifdown(ethernet->index); } -static struct connman_driver ethernet_driver = { +static struct connman_device_driver ethernet_driver = { .name = "ethernet", - .type = CONNMAN_ELEMENT_TYPE_DEVICE, - .subtype = CONNMAN_ELEMENT_SUBTYPE_ETHERNET, + .type = CONNMAN_DEVICE_TYPE_ETHERNET, .probe = ethernet_probe, .remove = ethernet_remove, + .enable = ethernet_enable, + .disable = ethernet_disable, }; static int ethernet_init(void) { - int err; - - err = connman_rtnl_register(ðernet_rtnl); - if (err < 0) - return err; - - err = connman_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_driver_unregister(ðernet_driver); - - connman_rtnl_unregister(ðernet_rtnl); + connman_device_driver_unregister(ðernet_driver); } -CONNMAN_PLUGIN_DEFINE("ethernet", "Ethernet interface plugin", VERSION, - ethernet_init, ethernet_exit) +CONNMAN_PLUGIN_DEFINE(ethernet, "Ethernet interface plugin", VERSION, + CONNMAN_PLUGIN_PRIORITY_DEFAULT, ethernet_init, ethernet_exit)