parse tunnel devices from config
[project/netifd.git] / tunnel.c
1 #include "netifd.h"
2 #include "device.h"
3 #include "config.h"
4 #include "system.h"
5
6 struct tunnel {
7 struct device dev;
8 device_state_cb set_state;
9 struct blob_attr *config;
10 };
11
12 static int
13 tunnel_set_state(struct device *dev, bool up)
14 {
15 struct tunnel *tun = container_of(dev, struct tunnel, dev);
16 int ret;
17
18 if (up) {
19 ret = system_add_ip_tunnel(dev->ifname, tun->config);
20 if (ret != 0) {
21 perror("add_ip_tunnel");
22 return ret;
23 }
24 }
25
26 ret = tun->set_state(dev, up);
27 if (ret || !up)
28 system_del_ip_tunnel(dev->ifname);
29
30 return ret;
31 }
32
33 static struct device *
34 tunnel_create(const char *name, struct blob_attr *attr)
35 {
36 struct tunnel *tun;
37 struct device *dev;
38
39 tun = calloc(1, sizeof(*tun));
40 dev = &tun->dev;
41 tun->config = config_memdup(attr);
42 device_init(dev, &tunnel_device_type, name);
43 tun->set_state = dev->set_state;
44 dev->set_state = tunnel_set_state;
45 device_set_present(dev, true);
46
47 return dev;
48 }
49
50 static void
51 tunnel_free(struct device *dev)
52 {
53 struct tunnel *tun = container_of(dev, struct tunnel, dev);
54
55 free(tun);
56 }
57
58 const struct device_type tunnel_device_type = {
59 .name = "IP tunnel",
60 .config_params = &tunnel_attr_list,
61
62 .create = tunnel_create,
63 .free = tunnel_free,
64 };
65
66