10 #include "interface.h"
11 #include "interface-ip.h"
17 addr_cmp(const void *k1
, const void *k2
, void *ptr
)
19 return memcmp(k1
, k2
, sizeof(struct device_addr
) -
20 offsetof(struct device_addr
, mask
));
24 route_cmp(const void *k1
, const void *k2
, void *ptr
)
26 return memcmp(k1
, k2
, sizeof(struct device_route
) -
27 offsetof(struct device_route
, mask
));
31 interface_update_proto_addr(struct vlist_tree
*tree
,
32 struct vlist_node
*node_new
,
33 struct vlist_node
*node_old
)
35 struct interface
*iface
;
37 struct device_addr
*addr
;
39 iface
= container_of(tree
, struct interface
, proto_addr
);
40 dev
= iface
->l3_dev
->dev
;
43 addr
= container_of(node_old
, struct device_addr
, node
);
44 if (!(addr
->flags
& DEVADDR_EXTERNAL
))
45 system_del_address(dev
, addr
);
50 addr
= container_of(node_new
, struct device_addr
, node
);
51 if (!(addr
->flags
& DEVADDR_EXTERNAL
))
52 system_add_address(dev
, addr
);
57 interface_update_proto_route(struct vlist_tree
*tree
,
58 struct vlist_node
*node_new
,
59 struct vlist_node
*node_old
)
61 struct interface
*iface
;
63 struct device_route
*route
;
65 iface
= container_of(tree
, struct interface
, proto_route
);
66 dev
= iface
->l3_dev
->dev
;
69 route
= container_of(node_old
, struct device_route
, node
);
70 if (!(route
->flags
& DEVADDR_EXTERNAL
))
71 system_del_route(dev
, route
);
76 route
= container_of(node_new
, struct device_route
, node
);
77 if (!(route
->flags
& DEVADDR_EXTERNAL
))
78 system_add_route(dev
, route
);
83 interface_add_dns_server(struct interface
*iface
, const char *str
)
87 s
= calloc(1, sizeof(*s
));
89 if (inet_pton(s
->af
, str
, &s
->addr
.in
))
93 if (inet_pton(s
->af
, str
, &s
->addr
.in
))
100 list_add_tail(&s
->list
, &iface
->proto_dns_servers
);
104 interface_add_dns_server_list(struct interface
*iface
, struct blob_attr
*list
)
106 struct blob_attr
*cur
;
109 blobmsg_for_each_attr(cur
, list
, rem
) {
110 if (blobmsg_type(cur
) != BLOBMSG_TYPE_STRING
)
113 if (!blobmsg_check_attr(cur
, NULL
))
116 interface_add_dns_server(iface
, blobmsg_data(cur
));
121 interface_clear_dns_servers(struct interface
*iface
)
123 struct dns_server
*s
, *tmp
;
125 list_for_each_entry_safe(s
, tmp
, &iface
->proto_dns_servers
, list
) {
132 interface_clear_dns_search(struct interface
*iface
)
134 struct dns_search_domain
*s
, *tmp
;
136 list_for_each_entry_safe(s
, tmp
, &iface
->proto_dns_search
, list
) {
143 interface_clear_dns(struct interface
*iface
)
145 interface_clear_dns_servers(iface
);
146 interface_clear_dns_search(iface
);
150 interface_write_resolv_conf(void)
152 struct interface
*iface
;
153 struct dns_server
*s
;
154 struct dns_search_domain
*d
;
155 char *path
= alloca(strlen(resolv_conf
) + 5);
160 sprintf(path
, "%s.tmp", resolv_conf
);
162 f
= fopen(path
, "w");
164 D(INTERFACE
, "Failed to open %s for writing\n", path
);
168 vlist_for_each_element(&interfaces
, iface
, node
) {
169 if (iface
->state
!= IFS_UP
)
172 if (list_empty(&iface
->proto_dns_search
) &&
173 list_empty(&iface
->proto_dns_servers
))
176 fprintf(f
, "# Interface %s\n", iface
->name
);
177 list_for_each_entry(s
, &iface
->proto_dns_servers
, list
) {
178 str
= inet_ntop(s
->af
, &s
->addr
, buf
, sizeof(buf
));
182 fprintf(f
, "nameserver %s\n", str
);
185 list_for_each_entry(d
, &iface
->proto_dns_search
, list
) {
186 fprintf(f
, "search %s\n", d
->name
);
190 if (rename(path
, resolv_conf
) < 0) {
191 D(INTERFACE
, "Failed to replace %s\n", resolv_conf
);
197 interface_ip_init(struct interface
*iface
)
199 vlist_init(&iface
->proto_route
, route_cmp
, interface_update_proto_route
,
200 struct device_route
, node
, mask
);
201 vlist_init(&iface
->proto_addr
, addr_cmp
, interface_update_proto_addr
,
202 struct device_addr
, node
, mask
);