summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDainis Jonitis <dainis.jonitis@ubnt.com>2019-04-29 14:40:14 +0300
committerHans Dedecker <dedeckeh@gmail.com>2019-05-03 14:51:52 +0200
commita2dd8d6bd918fb211db491c7dcb1810032f3f8ca (patch)
treeee6e81ddf764b091231cd6d38eedfb671e23350a
parenta17665eaabee92b04b947bb68b8717b18ace6615 (diff)
treewide: always init interface list heads during initialization
When allocating interface, init dhcpv4_assignments, dhcpv4_fr_ips and ia_assignments circular list heads to point to self. Avoids checking whether next pointer is not null all over the place. Signed-off-by: Dainis Jonitis <dainis.jonitis@ubnt.com>
-rw-r--r--src/config.c4
-rw-r--r--src/dhcpv4.c13
-rw-r--r--src/dhcpv6-ia.c14
-rw-r--r--src/ubus.c4
4 files changed, 15 insertions, 20 deletions
diff --git a/src/config.c b/src/config.c
index 399922b..dfeadac 100644
--- a/src/config.c
+++ b/src/config.c
@@ -440,6 +440,10 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr
iface->ndp_event.uloop.fd = -1;
iface->ndp_ping_fd = -1;
iface->dhcpv4_event.uloop.fd = -1;
+ INIT_LIST_HEAD(&iface->ia_assignments);
+ INIT_LIST_HEAD(&iface->dhcpv4_assignments);
+ INIT_LIST_HEAD(&iface->dhcpv4_fr_ips);
+
set_interface_defaults(iface);
avl_insert(&interfaces, &iface->avl);
diff --git a/src/dhcpv4.c b/src/dhcpv4.c
index b25046d..905f66f 100644
--- a/src/dhcpv4.c
+++ b/src/dhcpv4.c
@@ -88,12 +88,6 @@ int dhcpv4_setup_interface(struct interface *iface, bool enable)
{INADDR_ANY}, {0}};
int val = 1;
- if (!iface->dhcpv4_assignments.next)
- INIT_LIST_HEAD(&iface->dhcpv4_assignments);
-
- if (!iface->dhcpv4_fr_ips.next)
- INIT_LIST_HEAD(&iface->dhcpv4_fr_ips);
-
iface->dhcpv4_event.uloop.fd = socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, IPPROTO_UDP);
if (iface->dhcpv4_event.uloop.fd < 0) {
syslog(LOG_ERR, "socket(AF_INET): %m");
@@ -160,7 +154,7 @@ int dhcpv4_setup_interface(struct interface *iface, bool enable)
iface->dhcpv4_event.handle_dgram = handle_dhcpv4;
odhcpd_register(&iface->dhcpv4_event);
- } else if (iface->dhcpv4_assignments.next) {
+ } else {
while (!list_empty(&iface->dhcpv4_assignments))
free_assignment(list_first_entry(&iface->dhcpv4_assignments,
struct dhcp_assignment, head));
@@ -347,10 +341,11 @@ static void valid_until_cb(struct uloop_timeout *event)
time_t now = odhcpd_time();
avl_for_each_element(&interfaces, iface, avl) {
- if (iface->dhcpv4 != MODE_SERVER || iface->dhcpv4_assignments.next == NULL)
+ struct dhcp_assignment *a, *n;
+
+ if (iface->dhcpv4 != MODE_SERVER)
continue;
- struct dhcp_assignment *a, *n;
list_for_each_entry_safe(a, n, &iface->dhcpv4_assignments, head) {
if (!INFINITE_VALID(a->valid_until) && a->valid_until < now)
free_assignment(a);
diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c
index 6426a74..81c2481 100644
--- a/src/dhcpv6-ia.c
+++ b/src/dhcpv6-ia.c
@@ -62,7 +62,7 @@ int dhcpv6_ia_init(void)
int dhcpv6_ia_setup_interface(struct interface *iface, bool enable)
{
- if (!enable && iface->ia_assignments.next) {
+ if (!enable) {
struct dhcp_assignment *c;
while (!list_empty(&iface->ia_assignments)) {
@@ -74,9 +74,6 @@ int dhcpv6_ia_setup_interface(struct interface *iface, bool enable)
if (enable && iface->dhcpv6 == MODE_SERVER) {
struct dhcp_assignment *border;
- if (!iface->ia_assignments.next)
- INIT_LIST_HEAD(&iface->ia_assignments);
-
if (list_empty(&iface->ia_assignments)) {
border = calloc(1, sizeof(*border));
@@ -326,8 +323,7 @@ void dhcpv6_ia_write_statefile(void)
ctxt.iface->dhcpv4 != MODE_SERVER)
continue;
- if (ctxt.iface->dhcpv6 == MODE_SERVER &&
- ctxt.iface->ia_assignments.next) {
+ if (ctxt.iface->dhcpv6 == MODE_SERVER) {
list_for_each_entry(ctxt.c, &ctxt.iface->ia_assignments, head) {
if (!(ctxt.c->flags & OAF_BOUND) || ctxt.c->managed_size < 0)
continue;
@@ -355,9 +351,9 @@ void dhcpv6_ia_write_statefile(void)
}
}
- if (ctxt.iface->dhcpv4 == MODE_SERVER &&
- ctxt.iface->dhcpv4_assignments.next) {
+ if (ctxt.iface->dhcpv4 == MODE_SERVER) {
struct dhcp_assignment *c;
+
list_for_each_entry(c, &ctxt.iface->dhcpv4_assignments, head) {
if (!(c->flags & OAF_BOUND))
continue;
@@ -771,7 +767,7 @@ static void valid_until_cb(struct uloop_timeout *event)
avl_for_each_element(&interfaces, iface, avl) {
struct dhcp_assignment *a, *n;
- if (iface->dhcpv6 != MODE_SERVER || iface->ia_assignments.next == NULL)
+ if (iface->dhcpv6 != MODE_SERVER)
continue;
list_for_each_entry_safe(a, n, &iface->ia_assignments, head) {
diff --git a/src/ubus.c b/src/ubus.c
index 1bb8237..e9c5b6f 100644
--- a/src/ubus.c
+++ b/src/ubus.c
@@ -29,7 +29,7 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob
a = blobmsg_open_table(&b, "device");
avl_for_each_element(&interfaces, iface, avl) {
- if (iface->dhcpv4 != MODE_SERVER || iface->dhcpv4_assignments.next == NULL)
+ if (iface->dhcpv4 != MODE_SERVER)
continue;
void *i = blobmsg_open_table(&b, iface->ifname);
@@ -122,7 +122,7 @@ static int handle_dhcpv6_leases(_unused struct ubus_context *ctx, _unused struct
a = blobmsg_open_table(&b, "device");
avl_for_each_element(&interfaces, iface, avl) {
- if (iface->dhcpv6 != MODE_SERVER || iface->ia_assignments.next == NULL)
+ if (iface->dhcpv6 != MODE_SERVER)
continue;
void *i = blobmsg_open_table(&b, iface->ifname);