return ret;
}
+static void free_lease(struct lease *l)
+{
+ if (l->head.next)
+ list_del(&l->head);
+
+ free(l->duid);
+ free(l);
+}
+
static struct interface* get_interface(const char *name)
{
struct interface *c;
return NULL;
}
+static void set_interface_defaults(struct interface *iface)
+{
+ iface->managed = 1;
+ iface->learn_routes = 1;
+}
+
static void clean_interface(struct interface *iface)
{
free(iface->dns);
free(iface->dhcpv6_raw);
free(iface->filter_class);
memset(&iface->ra, 0, sizeof(*iface) - offsetof(struct interface, ra));
+ set_interface_defaults(iface);
}
static void close_interface(struct interface *iface)
return 0;
err:
- if (lease) {
- free(lease->duid);
- free(lease);
- }
+ if (lease)
+ free_lease(lease);
+
return -1;
}
strncpy(iface->name, name, sizeof(iface->name) - 1);
- /* Default settings */
- iface->managed = 1;
- iface->learn_routes = true;
+ set_interface_defaults(iface);
list_add(&iface->head, &interfaces);
overwrite = true;
{
struct uci_context *uci = uci_alloc_context();
- while (!list_empty(&leases)) {
- struct lease *l = list_first_entry(&leases, struct lease, head);
- list_del(&l->head);
- free(l->duid);
- free(l);
- }
+ while (!list_empty(&leases))
+ free_lease(list_first_entry(&leases, struct lease, head));
struct interface *master = NULL, *i, *n;
i->ndp = (master && master->ndp == RELAYD_RELAY) ?
RELAYD_RELAY : RELAYD_DISABLED;
- setup_router_interface(i, true);
- setup_dhcpv6_interface(i, true);
- setup_ndp_interface(i, true);
- setup_dhcpv4_interface(i, true);
+ setup_router_interface(i, !i->ignore || i->ra != RELAYD_DISABLED);
+ setup_dhcpv6_interface(i, !i->ignore || i->dhcpv6 != RELAYD_DISABLED);
+ setup_ndp_interface(i, !i->ignore || i->ndp != RELAYD_DISABLED);
+ setup_dhcpv4_interface(i, !i->ignore || i->dhcpv4 != RELAYD_DISABLED);
} else {
close_interface(i);
}