diff mbox series

netconfig: API to disable/enable ACD

Message ID 20220711140344.3464765-1-andrew.zaborowski@intel.com (mailing list archive)
State New
Headers show
Series netconfig: API to disable/enable ACD | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
prestwoj/iwd-ci-makedistcheck success Make Distcheck
prestwoj/iwd-ci-build success Build - Configure
prestwoj/iwd-ci-clang success clang PASS
prestwoj/iwd-ci-makecheckvalgrind success Make Check w/Valgrind
prestwoj/iwd-ci-makecheck success Make Check
prestwoj/iwd-ci-testrunner success test-runner PASS

Commit Message

Andrew Zaborowski July 11, 2022, 2:03 p.m. UTC
When using FILS IP Assignment, the received configuration will be passed
to l_netconfig as "static", yet we may want to skip ACD to avoid the
overhead.
---
 ell/ell.sym     |  1 +
 ell/netconfig.c | 40 ++++++++++++++++++++++++++++------------
 ell/netconfig.h |  1 +
 3 files changed, 30 insertions(+), 12 deletions(-)
diff mbox series

Patch

diff --git a/ell/ell.sym b/ell/ell.sym
index 8f4e59d..81cec64 100644
--- a/ell/ell.sym
+++ b/ell/ell.sym
@@ -747,6 +747,7 @@  global:
 	l_netconfig_set_gateway_override;
 	l_netconfig_set_dns_override;
 	l_netconfig_set_domain_names_override;
+	l_netconfig_set_acd_enabled;
 	l_netconfig_check_config;
 	l_netconfig_reset_config;
 	l_netconfig_start;
diff --git a/ell/netconfig.c b/ell/netconfig.c
index 28afa9b..8f87e64 100644
--- a/ell/netconfig.c
+++ b/ell/netconfig.c
@@ -67,6 +67,7 @@  struct l_netconfig {
 	char *v4_gateway_override;
 	char **v4_dns_override;
 	char **v4_domain_names_override;
+	bool acd_enabled;
 
 	bool v6_enabled;
 	struct l_rtnl_address *v6_static_addr;
@@ -1031,7 +1032,6 @@  LIB_EXPORT struct l_netconfig *l_netconfig_new(uint32_t ifindex)
 
 	nc = l_new(struct l_netconfig, 1);
 	nc->ifindex = ifindex;
-	nc->v4_enabled = true;
 
 	nc->addresses.current = l_queue_new();
 	nc->addresses.added = l_queue_new();
@@ -1061,6 +1061,7 @@  LIB_EXPORT struct l_netconfig *l_netconfig_new(uint32_t ifindex)
 	/* Disable in-kernel autoconfiguration for the interface */
 	netconfig_proc_write_ipv6_uint_setting(nc, "accept_ra", 0);
 
+	l_netconfig_reset_config(nc);
 	return nc;
 }
 
@@ -1275,6 +1276,16 @@  LIB_EXPORT bool l_netconfig_set_domain_names_override(
 	return true;
 }
 
+LIB_EXPORT bool l_netconfig_set_acd_enabled(struct l_netconfig *netconfig,
+						bool enabled)
+{
+	if (unlikely(!netconfig || netconfig->started))
+		return false;
+
+	netconfig->acd_enabled = enabled;
+	return true;
+}
+
 static bool netconfig_check_family_config(struct l_netconfig *nc,
 						uint8_t family)
 {
@@ -1343,6 +1354,7 @@  LIB_EXPORT bool l_netconfig_reset_config(struct l_netconfig *netconfig)
 	l_netconfig_set_gateway_override(netconfig, AF_INET, NULL);
 	l_netconfig_set_dns_override(netconfig, AF_INET, NULL);
 	l_netconfig_set_domain_names_override(netconfig, AF_INET, NULL);
+	l_netconfig_set_acd_enabled(netconfig, true);
 	l_netconfig_set_family_enabled(netconfig, AF_INET6, false);
 	l_netconfig_set_static_addr(netconfig, AF_INET6, NULL);
 	l_netconfig_set_gateway_override(netconfig, AF_INET6, NULL);
@@ -1434,25 +1446,29 @@  static void netconfig_do_static_config(struct l_idle *idle, void *user_data)
 	l_idle_remove(l_steal_ptr(nc->do_static_work));
 
 	if (nc->v4_static_addr && !nc->v4_configured) {
-		char ip[INET_ADDRSTRLEN];
+		if (nc->acd_enabled) {
+			char ip[INET_ADDRSTRLEN];
 
-		l_rtnl_address_get_address(nc->v4_static_addr, ip);
+			l_rtnl_address_get_address(nc->v4_static_addr, ip);
 
-		nc->acd = l_acd_new(nc->ifindex);
-                l_acd_set_event_handler(nc->acd, netconfig_ipv4_acd_event, nc,
-					NULL);
+			nc->acd = l_acd_new(nc->ifindex);
+			l_acd_set_event_handler(nc->acd,
+						netconfig_ipv4_acd_event, nc,
+						NULL);
 
-		if (!l_acd_start(nc->acd, ip)) {
-			l_acd_destroy(l_steal_ptr(nc->acd));
+			if (l_acd_start(nc->acd, ip))
+				goto configure_ipv6;
 
+			l_acd_destroy(l_steal_ptr(nc->acd));
 			/* Configure right now as a fallback */
-			netconfig_add_v4_static_address_routes(nc);
-			nc->v4_configured = true;
-			netconfig_emit_event(nc, AF_INET,
-						L_NETCONFIG_EVENT_CONFIGURE);
 		}
+
+		netconfig_add_v4_static_address_routes(nc);
+		nc->v4_configured = true;
+		netconfig_emit_event(nc, AF_INET, L_NETCONFIG_EVENT_CONFIGURE);
 	}
 
+configure_ipv6:
 	if (nc->v6_static_addr && !nc->v6_configured) {
 		netconfig_add_v6_static_address_routes(nc);
 		nc->v6_configured = true;
diff --git a/ell/netconfig.h b/ell/netconfig.h
index ac467b6..7710d83 100644
--- a/ell/netconfig.h
+++ b/ell/netconfig.h
@@ -68,6 +68,7 @@  bool l_netconfig_set_dns_override(struct l_netconfig *netconfig, uint8_t family,
 					char **dns_list);
 bool l_netconfig_set_domain_names_override(struct l_netconfig *netconfig,
 						uint8_t family, char **names);
+bool l_netconfig_set_acd_enabled(struct l_netconfig *netconfig, bool enabled);
 bool l_netconfig_check_config(struct l_netconfig *netconfig);
 bool l_netconfig_reset_config(struct l_netconfig *netconfig);