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)
{
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();
connman_device_set_data(device, NULL);
- ethernet_list = g_slist_remove(ethernet_list, device);
+ connman_rtnl_remove_watch(ethernet->watch);
g_free(ethernet);
}
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,