1 /* 2 * netifd - network interface daemon 3 * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 7 * as published by the Free Software Foundation 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 */ 14 #include "netifd.h" 15 #include "device.h" 16 #include "config.h" 17 #include "system.h" 18 19 struct tunnel { 20 struct device dev; 21 device_state_cb set_state; 22 }; 23 24 static int 25 tunnel_set_state(struct device *dev, bool up) 26 { 27 struct tunnel *tun = container_of(dev, struct tunnel, dev); 28 int ret; 29 30 if (up) { 31 ret = system_add_ip_tunnel(dev, dev->config); 32 if (ret != 0) 33 return ret; 34 } 35 36 ret = tun->set_state(dev, up); 37 if (ret || !up) 38 system_del_ip_tunnel(dev); 39 40 return ret; 41 } 42 43 static enum dev_change_type 44 tunnel_reload(struct device *dev, struct blob_attr *attr, 45 struct blob_attr **tb_dev) 46 { 47 const struct uci_blob_param_list *cfg = dev->type->config_params; 48 49 if (uci_blob_check_equal(dev->config, attr, cfg)) 50 return DEV_CONFIG_NO_CHANGE; 51 52 return DEV_CONFIG_RESTART; 53 } 54 55 static struct device * 56 tunnel_create(const char *name, struct device_type *devtype, 57 struct blob_attr *attr) 58 { 59 struct tunnel *tun; 60 struct device *dev; 61 62 tun = calloc(1, sizeof(*tun)); 63 if (!tun) 64 return NULL; 65 66 dev = &tun->dev; 67 68 if (device_init(dev, devtype, name) < 0) { 69 device_cleanup(dev); 70 free(tun); 71 return NULL; 72 } 73 74 tun->set_state = dev->set_state; 75 dev->set_state = tunnel_set_state; 76 device_apply_config(dev, devtype, attr); 77 device_set_present(dev, true); 78 79 return dev; 80 } 81 82 static void 83 tunnel_free(struct device *dev) 84 { 85 struct tunnel *tun = container_of(dev, struct tunnel, dev); 86 87 free(tun); 88 } 89 90 struct device_type tunnel_device_type = { 91 .name = "tunnel", 92 .config_params = &tunnel_attr_list, 93 .reload = tunnel_reload, 94 .create = tunnel_create, 95 .free = tunnel_free, 96 }; 97 98 static void __init tunnel_device_type_init(void) 99 { 100 device_type_add(&tunnel_device_type); 101 } 102
This page was automatically generated by LXR 0.3.1. • OpenWrt