Wireless Daemon for Linux
 help / color / mirror / Atom feed
From: Denis Kenzior <denkenz at gmail.com>
To: iwd at lists.01.org
Subject: Re: [PATCH] netconfig: Add IP configuration properties on Station and P2P
Date: Wed, 22 Sep 2021 15:03:26 -0500	[thread overview]
Message-ID: <9a08d49a-ebfc-a57b-e6d4-a863063a2e54@gmail.com> (raw)
In-Reply-To: 20210917101822.556531-1-andrew.zaborowski@intel.com

[-- Attachment #1: Type: text/plain, Size: 7484 bytes --]

Hi Andrew,

On 9/17/21 5:18 AM, Andrew Zaborowski wrote:
> Add the IPv{4,6}Configuration D-Bus interfaces on the station and P2P
> objects that expose current netconfig values.  Access Point and P2P-GO
> are not handled yet.
> ---
>   src/dbus.h      |   2 +
>   src/netconfig.c | 651 +++++++++++++++++++++++++++++++++++++++++++-----
>   src/netconfig.h |   2 +-
>   src/p2p.c       |   4 +-
>   src/station.c   |   8 +-
>   5 files changed, 604 insertions(+), 63 deletions(-)
> 

Can you split this patch up a bit more, there's just way too much going on.  It 
is really hard to review in this form.

> diff --git a/src/dbus.h b/src/dbus.h
> index 7703b37f..a345f7ac 100644
> --- a/src/dbus.h
> +++ b/src/dbus.h
> @@ -43,6 +43,8 @@
>   #define IWD_STATION_DIAGNOSTIC_INTERFACE "net.connman.iwd.StationDiagnostic"
>   #define IWD_AP_DIAGNOSTIC_INTERFACE "net.connman.iwd.AccessPointDiagnostic"
>   #define IWD_STATION_DEBUG_INTERFACE "net.connman.iwd.StationDebug"
> +#define IWD_IPV4_CONFIG_INTERFACE "net.connman.iwd.IPv4Configuration"
> +#define IWD_IPV6_CONFIG_INTERFACE "net.connman.iwd.IPv6Configuration"
>   
>   #define IWD_BASE_PATH "/net/connman/iwd"
>   #define IWD_AGENT_MANAGER_PATH IWD_BASE_PATH
> diff --git a/src/netconfig.c b/src/netconfig.c
> index 421270c9..a529fad4 100644
> --- a/src/netconfig.c
> +++ b/src/netconfig.c
> @@ -49,6 +49,7 @@
>   #include "src/resolve.h"
>   #include "src/util.h"
>   #include "src/ie.h"
> +#include "src/dbus.h"
>   #include "src/netconfig.h"
>   
>   struct netconfig {
> @@ -58,14 +59,23 @@ struct netconfig {
>   	uint8_t rtm_protocol;
>   	uint8_t rtm_v6_protocol;
>   	struct l_rtnl_address *v4_address;
> +	struct l_rtnl_address *v6_address;
>   	char **dns4_overrides;
>   	char **dns6_overrides;
> +	char **dns4_list;
> +	char **dns6_list;
>   	struct ie_fils_ip_addr_response_info *fils_override;
> +	char *v4_gateway_str;
> +	char *v6_gateway_str;
> +	char *v4_domain;
> +	char **v6_domains;

Maybe a commit for each member you're adding and a short blurb why..

>   
>   	const struct l_settings *active_settings;
>   
>   	netconfig_notify_func_t notify;
>   	void *user_data;
> +	bool v4_configured;
> +	bool v6_configured;

Then the IPv4 & IPv6 DBus interfaces

>   
>   	struct resolve *resolve;
>   
> @@ -74,6 +84,13 @@ struct netconfig {
>   	uint32_t addr4_add_cmd_id;
>   	uint32_t addr6_add_cmd_id;
>   	uint32_t route4_add_gateway_cmd_id;
> +	uint32_t route6_add_cmd_id;

This seems like it would belong in a separate commit?

> +
> +	char *dbus_path;
> +	struct interface_data {
> +		bool is_ipv4;
> +		struct netconfig *netconfig;
> +	} v4_data, v6_data;
>   };
>   
>   static struct l_netlink *rtnl;
> @@ -132,6 +149,7 @@ static void netconfig_free(void *data)
>   	l_dhcp_client_destroy(netconfig->dhcp_client);
>   	l_dhcp6_client_destroy(netconfig->dhcp6_client);
>   
> +	l_free(netconfig->dbus_path);
>   	l_free(netconfig);
>   }
>   
> @@ -257,6 +275,18 @@ static void netconfig_set_neighbor_entry_cb(int error,
>   			strerror(-error), error);
>   }
>   
> +static bool netconfig_strv_eq(char *const *a, char *const *b)
> +{
> +	if (l_strv_length((char **) a) != l_strv_length((char **) b))
> +		return false;
> +
> +	for (; a && *a; a++, b++)
> +		if (strcmp(*a, *b))
> +			return false;
> +
> +	return true;

This probably belongs in ell?

> +}
> +
>   static int netconfig_set_dns(struct netconfig *netconfig)
>   {
>   	const uint8_t *fils_dns4_mac = NULL;
> @@ -270,23 +300,25 @@ static int netconfig_set_dns(struct netconfig *netconfig)
>   	char **dns_list;
>   	const struct ie_fils_ip_addr_response_info *fils =
>   		netconfig->fils_override;
> +	struct l_dbus *dbus = dbus_get_bus();
>   
> -	if (!dns4_list && !dns6_list)
> -		return 0;
> +	if (dns6_list) {
> +		dns_list = l_malloc(sizeof(char *) *
> +					(n_entries4 + n_entries6 + 1));
>   
> -	dns_list = dns4_list;
> +		if (dns4_list)
> +			memcpy(dns_list, dns4_list,
> +				sizeof(char *) * n_entries4);
>   
> -	if (dns6_list) {
> -		dns_list = l_realloc(dns_list,
> -				sizeof(char *) * (n_entries4 + n_entries6 + 1));
>   		memcpy(dns_list + n_entries4, dns6_list,
>   			sizeof(char *) * (n_entries6 + 1));
> -		/* Contents now belong to dns_list, so no l_strfreev */
> -		l_free(dns6_list);
> -	}
> +	} else
> +		dns_list = dns4_list;
>   
>   	resolve_set_dns(netconfig->resolve, dns_list);
> -	l_strv_free(dns_list);
> +
> +	if (dns6_list)
> +		l_free(dns_list);

Why are you doing all this when you can just check for dns[4|6]_list being 
changed prior to building the list for submission to resolve_set_dns?

>   
>   	if (fils_dns4_mac && !l_rtnl_neighbor_set_hwaddr(rtnl,
>   					netconfig->ifindex, AF_INET,
> @@ -302,6 +334,30 @@ static int netconfig_set_dns(struct netconfig *netconfig)
>   					NULL))
>   		l_debug("l_rtnl_neighbor_set_hwaddr failed");
>   
> +	if (netconfig_strv_eq(netconfig->dns4_list, dns4_list))
> +		l_strv_free(dns4_list);
> +	else {
> +		l_strv_free(netconfig->dns4_list);
> +		netconfig->dns4_list = dns4_list;
> +
> +		if (netconfig->dbus_path && netconfig->v4_configured)
> +			l_dbus_property_changed(dbus, netconfig->dbus_path,
> +						IWD_IPV4_CONFIG_INTERFACE,
> +						"DomainNameServers");
> +	}
> +
> +	if (netconfig_strv_eq(netconfig->dns6_list, dns6_list))
> +		l_strv_free(dns6_list);
> +	else {
> +		l_strv_free(netconfig->dns6_list);
> +		netconfig->dns6_list = dns6_list;
> +
> +		if (netconfig->dbus_path && netconfig->v6_configured)
> +			l_dbus_property_changed(dbus, netconfig->dbus_path,
> +						IWD_IPV6_CONFIG_INTERFACE,
> +						"DomainNameServers");
> +	}
> +

This really needs a convenience method instead of copy-pasting it all over.

>   	return 0;
>   }
>   
> @@ -328,6 +384,7 @@ static int netconfig_set_domains(struct netconfig *netconfig)
>   	char *v4_domain = NULL;
>   	char **v6_domains = NULL;
>   	char **p;
> +	struct l_dbus *dbus = dbus_get_bus();
>   
>   	memset(domains, 0, sizeof(domains));
>   
> @@ -358,8 +415,30 @@ static int netconfig_set_domains(struct netconfig *netconfig)
>   					L_ARRAY_SIZE(domains) - 1, *p);
>   
>   	resolve_set_domains(netconfig->resolve, domains);
> -	l_strv_free(v6_domains);
> -	l_free(v4_domain);
> +
> +	if (l_streq0(v4_domain, netconfig->v4_domain))
> +		l_free(v4_domain);
> +	else {
> +		l_free(netconfig->v4_domain);
> +		netconfig->v4_domain = v4_domain;
> +
> +		if (netconfig->dbus_path && netconfig->v4_configured)
> +			l_dbus_property_changed(dbus, netconfig->dbus_path,
> +						IWD_IPV4_CONFIG_INTERFACE,
> +						"DomainNames");
> +	}
> +
> +	if (netconfig_strv_eq(netconfig->v6_domains, v6_domains))
> +		l_strv_free(v6_domains);
> +	else {
> +		l_strv_free(netconfig->v6_domains);
> +		netconfig->v6_domains = v6_domains;
> +
> +		if (netconfig->dbus_path && netconfig->v6_configured)
> +			l_dbus_property_changed(dbus, netconfig->dbus_path,
> +						IWD_IPV6_CONFIG_INTERFACE,
> +						"DomainNames");
> +	}

As above.  And I still wonder whether this belongs in the methods that invoke 
the resolve_* functionality.  The logic that invokes these methods might 
actually have a better idea if anything actually changed or it is being invoked 
for the first time due to a lease being obtained...

>   
>   	return 0;
>   }

Regards,
-Denis

             reply	other threads:[~2021-09-22 20:03 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-22 20:03 Denis Kenzior [this message]
  -- strict thread matches above, loose matches on Subject: below --
2021-09-22 22:32 [PATCH] netconfig: Add IP configuration properties on Station and P2P Denis Kenzior
2021-09-22 22:19 Andrew Zaborowski
2021-09-17 10:18 Andrew Zaborowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=9a08d49a-ebfc-a57b-e6d4-a863063a2e54@gmail.com \
    --to=iwd@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox