shell: add tunnel support
[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