add support for externally managed ip addresses and routes
[project/netifd.git] / interface-ip.c
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4
5 #include "netifd.h"
6 #include "device.h"
7 #include "interface.h"
8 #include "interface-ip.h"
9 #include "proto.h"
10 #include "ubus.h"
11 #include "system.h"
12
13 static void
14 interface_update_proto_addr(struct vlist_tree *tree,
15                             struct vlist_node *node_new,
16                             struct vlist_node *node_old)
17 {
18         struct interface *iface;
19         struct device *dev;
20         struct device_addr *addr;
21
22         iface = container_of(tree, struct interface, proto_addr);
23         dev = iface->l3_dev->dev;
24
25         if (node_old) {
26                 addr = container_of(node_old, struct device_addr, node);
27                 if (!(addr->flags & DEVADDR_EXTERNAL))
28                         system_del_address(dev, addr);
29                 free(addr);
30         }
31
32         if (node_new) {
33                 addr = container_of(node_new, struct device_addr, node);
34                 if (!(addr->flags & DEVADDR_EXTERNAL))
35                         system_add_address(dev, addr);
36         }
37 }
38
39 static void
40 interface_update_proto_route(struct vlist_tree *tree,
41                              struct vlist_node *node_new,
42                              struct vlist_node *node_old)
43 {
44         struct interface *iface;
45         struct device *dev;
46         struct device_route *route;
47
48         iface = container_of(tree, struct interface, proto_route);
49         dev = iface->l3_dev->dev;
50
51         if (node_old) {
52                 route = container_of(node_old, struct device_route, node);
53                 if (!(route->flags & DEVADDR_EXTERNAL))
54                         system_del_route(dev, route);
55                 free(route);
56         }
57
58         if (node_new) {
59                 route = container_of(node_new, struct device_route, node);
60                 if (!(route->flags & DEVADDR_EXTERNAL))
61                         system_add_route(dev, route);
62         }
63 }
64
65 void
66 interface_ip_init(struct interface *iface)
67 {
68         vlist_init(&iface->proto_route, interface_update_proto_route,
69                    struct device_route, node, mask, addr);
70         vlist_init(&iface->proto_addr, interface_update_proto_addr,
71                    struct device_addr, node, mask, addr);
72 }
73