X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=tunnel.c;h=aa60019c18102046bc6cad4f1202aecf29b33701;hp=e756973d099012c42783dd38f26f5f101ac29465;hb=9cd56141e80ea7d19350584d382d303f884d0aa5;hpb=1c7bff698eb7adbe239ccf400345cfda3d466f39 diff --git a/tunnel.c b/tunnel.c index e756973..aa60019 100644 --- a/tunnel.c +++ b/tunnel.c @@ -1,3 +1,16 @@ +/* + * netifd - network interface daemon + * Copyright (C) 2012 Felix Fietkau + * + * 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 published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ #include "netifd.h" #include "device.h" #include "config.h" @@ -6,7 +19,6 @@ struct tunnel { struct device dev; device_state_cb set_state; - struct blob_attr *config; }; static int @@ -16,11 +28,9 @@ tunnel_set_state(struct device *dev, bool up) int ret; if (up) { - ret = system_add_ip_tunnel(dev->ifname, tun->config); - if (ret != 0) { - perror("add_ip_tunnel"); + ret = system_add_ip_tunnel(dev->ifname, dev->config); + if (ret != 0) return ret; - } } ret = tun->set_state(dev, up); @@ -30,6 +40,27 @@ tunnel_set_state(struct device *dev, bool up) return ret; } +static enum dev_change_type +tunnel_reload(struct device *dev, struct blob_attr *attr) +{ + struct blob_attr *tb_dev[__DEV_ATTR_MAX]; + const struct uci_blob_param_list *cfg = dev->type->config_params; + + if (uci_blob_check_equal(dev->config, attr, cfg)) + return DEV_CONFIG_NO_CHANGE; + + if (attr) { + memset(tb_dev, 0, sizeof(tb_dev)); + + blobmsg_parse(device_attr_list.params, __DEV_ATTR_MAX, tb_dev, + blob_data(attr), blob_len(attr)); + } + + device_init_settings(dev, tb_dev); + + return DEV_CONFIG_RESTART; +} + static struct device * tunnel_create(const char *name, struct blob_attr *attr) { @@ -38,10 +69,10 @@ tunnel_create(const char *name, struct blob_attr *attr) tun = calloc(1, sizeof(*tun)); dev = &tun->dev; - tun->config = config_memdup(attr); device_init(dev, &tunnel_device_type, name); tun->set_state = dev->set_state; dev->set_state = tunnel_set_state; + device_set_config(dev, &tunnel_device_type, attr); device_set_present(dev, true); return dev; @@ -58,7 +89,7 @@ tunnel_free(struct device *dev) const struct device_type tunnel_device_type = { .name = "IP tunnel", .config_params = &tunnel_attr_list, - + .reload = tunnel_reload, .create = tunnel_create, .free = tunnel_free, };