All of lore.kernel.org
 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=unknown@example.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.