diff mbox series

[1/4] connection: Simplify 'set_default_gateway' flow.

Message ID 20231130052622.1335266-2-gerickson@nuovations.com (mailing list archive)
State Not Applicable, archived
Headers show
Series connection: Simplify '{un,}set_default_gateway' Flow | expand

Commit Message

Grant Erickson Nov. 30, 2023, 5:26 a.m. UTC
Ostensibly over time, the logic of 'set_default_gateway' has become a
bit complicated with early returns, gotos, repeated state checks, and
duplicated function calls.

However, amidst all of that, there is a simpler flow to surface. At
its core, the function is two outer conditional blocks, one for IPv4
and one for IPv6, and three inner conditional blocks within those: one
for a VPN, one for a gateway with an any/unspecified address, and one
for everything else. On success, a call to
'__connman_service_indicate_default' is made; on failure, it is not.

This simplifies the flow of 'set_default_gateway' accordingly,
curtailing the number of early returns, eliminating all of the gotos,
reducing the repeated state checks and function calls to one through
the use of those simplified conditional blocks.
---
 src/connection.c | 83 ++++++++++++++++++++++--------------------------
 1 file changed, 38 insertions(+), 45 deletions(-)
diff mbox series

Patch

diff --git a/src/connection.c b/src/connection.c
index 23eb3a45def3..9979ca02c356 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -884,64 +884,57 @@  static void set_default_gateway(struct gateway_data *data,
 	else
 		return;
 
-	if (do_ipv4 && data->ipv4_config &&
-					data->ipv4_config->vpn) {
-		connman_inet_set_gateway_interface(data->index);
-		data->ipv4_config->active = true;
+	if (do_ipv4 && data->ipv4_config) {
+		if (data->ipv4_config->vpn) {
+			connman_inet_set_gateway_interface(data->index);
 
-		DBG("set %p index %d vpn %s index %d phy %s",
-			data, data->index, data->ipv4_config->vpn_ip,
-			data->ipv4_config->vpn_phy_index,
-			data->ipv4_config->vpn_phy_ip);
+			data->ipv4_config->active = true;
 
-		__connman_service_indicate_default(data->service);
+			DBG("set %p index %d vpn %s index %d phy %s",
+				data, data->index, data->ipv4_config->vpn_ip,
+				data->ipv4_config->vpn_phy_index,
+				data->ipv4_config->vpn_phy_ip);
+		} else if (is_ipv4_addr_any_str(data->ipv4_config->gateway)) {
+			if (connman_inet_set_gateway_interface(
+						data->index) < 0)
+				return;
 
-		return;
+			data->ipv4_config->active = true;
+		} else {
+			status4 = __connman_inet_add_default_to_table(
+						RT_TABLE_MAIN,
+						data->index,
+						data->ipv4_config->gateway);
+		}
 	}
 
-	if (do_ipv6 && data->ipv6_config &&
-					data->ipv6_config->vpn) {
-		connman_inet_set_ipv6_gateway_interface(data->index);
-		data->ipv6_config->active = true;
-
-		DBG("set %p index %d vpn %s index %d phy %s",
-			data, data->index, data->ipv6_config->vpn_ip,
-			data->ipv6_config->vpn_phy_index,
-			data->ipv6_config->vpn_phy_ip);
+	if (do_ipv6 && data->ipv6_config) {
+		if (data->ipv6_config->vpn) {
+			connman_inet_set_ipv6_gateway_interface(data->index);
 
-		__connman_service_indicate_default(data->service);
+			data->ipv6_config->active = true;
 
-		return;
-	}
-
-	if (do_ipv4 && data->ipv4_config &&
-			is_ipv4_addr_any_str(data->ipv4_config->gateway)) {
-		if (connman_inet_set_gateway_interface(data->index) < 0)
-			return;
-		data->ipv4_config->active = true;
-		goto done;
-	}
+			DBG("set %p index %d vpn %s index %d phy %s",
+				data, data->index, data->ipv6_config->vpn_ip,
+				data->ipv6_config->vpn_phy_index,
+				data->ipv6_config->vpn_phy_ip);
+		} else if (is_ipv6_addr_any_str(data->ipv6_config->gateway)) {
+			if (connman_inet_set_ipv6_gateway_interface(
+						data->index) < 0)
+				return;
 
-	if (do_ipv6 && data->ipv6_config &&
-			is_ipv6_addr_any_str(data->ipv6_config->gateway)) {
-		if (connman_inet_set_ipv6_gateway_interface(data->index) < 0)
-			return;
-		data->ipv6_config->active = true;
-		goto done;
+			data->ipv6_config->active = true;
+		} else {
+			status6 = __connman_inet_add_default_to_table(
+						RT_TABLE_MAIN,
+						data->index,
+						data->ipv6_config->gateway);
+		}
 	}
 
-	if (do_ipv6 && data->ipv6_config)
-		status6 = __connman_inet_add_default_to_table(RT_TABLE_MAIN,
-					data->index, data->ipv6_config->gateway);
-
-	if (do_ipv4 && data->ipv4_config)
-		status4 = __connman_inet_add_default_to_table(RT_TABLE_MAIN,
-					data->index, data->ipv4_config->gateway);
-
 	if (status4 < 0 || status6 < 0)
 		return;
 
-done:
 	__connman_service_indicate_default(data->service);
 }