fix log buffer splitting
[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                         return ret;
22         }
23
24         ret = tun->set_state(dev, up);
25         if (ret || !up)
26                 system_del_ip_tunnel(dev->ifname);
27
28         return ret;
29 }
30
31 static struct device *
32 tunnel_create(const char *name, struct blob_attr *attr)
33 {
34         struct tunnel *tun;
35         struct device *dev;
36
37         tun = calloc(1, sizeof(*tun));
38         dev = &tun->dev;
39         tun->config = config_memdup(attr);
40         device_init(dev, &tunnel_device_type, name);
41         tun->set_state = dev->set_state;
42         dev->set_state = tunnel_set_state;
43         device_set_present(dev, true);
44
45         return dev;
46 }
47
48 static void
49 tunnel_free(struct device *dev)
50 {
51         struct tunnel *tun = container_of(dev, struct tunnel, dev);
52
53         free(tun);
54 }
55
56 const struct device_type tunnel_device_type = {
57         .name = "IP tunnel",
58         .config_params = &tunnel_attr_list,
59
60         .create = tunnel_create,
61         .free = tunnel_free,
62 };
63
64