diff mbox series

manager: add support for changing 'PreferredTechnologies' over DBus

Message ID 20240704204732.56553-1-alex@shruggie.ro (mailing list archive)
State Superseded
Headers show
Series manager: add support for changing 'PreferredTechnologies' over DBus | expand

Commit Message

Alexandru Ardelean July 4, 2024, 8:47 p.m. UTC
This change adds support for reading/modifying the 'PreferredTechnologies'
over DBus.
This can be extended to 'DefaultAutoConnectTechnologies',
'DefaultFavoriteTechnologies' & 'AlwaysConnectedTechnologies' as well.
However the interest (so far) was in changing the 'PreferredTechnologies'
order (at runtime) between cellular and wifi.
Also, 'PreferredTechnologies' was the only that was tested.

Changing 'PreferredTechnologies' seems to yield the desired result, as the
switch between cellular/wifi does not need to be super-fast.
And it changes the routing table (as desired) when cellular is preferred
over WiFi (and vice-versa).

On some boxes that have both cellular & WiFi, it's often desired to prefer
cellular (over WiFi) in case WiFi is not able to connect to the internet.
The logic (for this switching) can be determined outside of connman.
Setting 'PreferredTechnologies' helps in this case.
---
 doc/connman.conf.5.in |   2 ++
 doc/manager-api.txt   |  13 ++++++++
 include/setting.h     |   2 ++
 src/main.c            |  22 ++++++++++++++
 src/manager.c         |  67 ++++++++++++++++++++++++++++++++++++++++++
 tools/ip6tables-test  | Bin 0 -> 71344 bytes
 6 files changed, 106 insertions(+)
 create mode 100755 tools/ip6tables-test

GIT binary patch
literal 71344
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
TF{xg&{0CP$&X0N-yi4=nAA-p|

literal 0
HcmV?d00001

Comments

Alexandru Ardelean July 5, 2024, 3:47 a.m. UTC | #1
On Thu, Jul 4, 2024 at 11:47 PM Alexandru Ardelean <alex@shruggie.ro> wrote:
>
> This change adds support for reading/modifying the 'PreferredTechnologies'
> over DBus.
> This can be extended to 'DefaultAutoConnectTechnologies',
> 'DefaultFavoriteTechnologies' & 'AlwaysConnectedTechnologies' as well.
> However the interest (so far) was in changing the 'PreferredTechnologies'
> order (at runtime) between cellular and wifi.
> Also, 'PreferredTechnologies' was the only that was tested.
>
> Changing 'PreferredTechnologies' seems to yield the desired result, as the
> switch between cellular/wifi does not need to be super-fast.
> And it changes the routing table (as desired) when cellular is preferred
> over WiFi (and vice-versa).
>
> On some boxes that have both cellular & WiFi, it's often desired to prefer
> cellular (over WiFi) in case WiFi is not able to connect to the internet.
> The logic (for this switching) can be determined outside of connman.
> Setting 'PreferredTechnologies' helps in this case.
> ---
>  doc/connman.conf.5.in |   2 ++
>  doc/manager-api.txt   |  13 ++++++++
>  include/setting.h     |   2 ++
>  src/main.c            |  22 ++++++++++++++
>  src/manager.c         |  67 ++++++++++++++++++++++++++++++++++++++++++
>  tools/ip6tables-test  | Bin 0 -> 71344 bytes
>  6 files changed, 106 insertions(+)
>  create mode 100755 tools/ip6tables-test

Ooops.
I submitted a binary by mistake
Apologies. Was polishing the patch and did a "git add ."

Will add it to .gitignore and make a V2 of this.

>
> diff --git a/doc/connman.conf.5.in b/doc/connman.conf.5.in
> index 3eb240f5..c8ce8eb6 100644
> --- a/doc/connman.conf.5.in
> +++ b/doc/connman.conf.5.in
> @@ -101,6 +101,8 @@ with state 'ready' or with a non-preferred type; a service
>  of a preferred technology type in state 'online' will get
>  the default route when compared to either a non-preferred
>  type or a preferred type further down in the list.
> +This property can be read and set over DBus as well, on
> +the 'net.connman.Manager' DBus interface.
>  .TP
>  .BI NetworkInterfaceBlacklist= interface\fR[,...]
>  List of blacklisted network interfaces separated by ",".
> diff --git a/doc/manager-api.txt b/doc/manager-api.txt
> index 6eaa0a38..3be9cffc 100644
> --- a/doc/manager-api.txt
> +++ b/doc/manager-api.txt
> @@ -319,3 +319,16 @@ Properties string State [readonly]
>                         and does not affect ConnMan in any way.
>
>                         The default value is false.
> +
> +               array{string} PreferredTechnologies [readwrite] [experminental]
> +
> +                       This property is the same one that is defined in
> +                       /etc/connman/main.conf. It controls the order of
> +                       preferred technologies (e.g. wifi, cellular) at
> +                       runtime.
> +                       Changing it here will not have an immediate effect.
> +                       It's only when connman gets triggered via service changes
> +                       that this gets taken into consideration. Or, when it's
> +                       triggered via manual connect/disconnect of services.
> +
> +                       The default value is defined in /etc/connman/main.conf.
> diff --git a/include/setting.h b/include/setting.h
> index 920e6754..6a575dc4 100644
> --- a/include/setting.h
> +++ b/include/setting.h
> @@ -33,6 +33,8 @@ unsigned int connman_setting_get_uint(const char *key);
>  char *connman_setting_get_string(const char *key);
>  char **connman_setting_get_string_list(const char *key);
>  unsigned int *connman_setting_get_uint_list(const char *key);
> +int connman_setting_set_uint_list(const char *key, const unsigned int *lst,
> +                                  int len);
>
>  unsigned int connman_timeout_input_request(void);
>  unsigned int connman_timeout_browser_launch(void);
> diff --git a/src/main.c b/src/main.c
> index f5da979b..7858b967 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -1122,6 +1122,28 @@ unsigned int *connman_setting_get_uint_list(const char *key)
>         return NULL;
>  }
>
> +int connman_setting_set_uint_list(const char *key, const unsigned int *lst,
> +                                 int len)
> +{
> +       unsigned int *new_list;
> +
> +       new_list = g_try_new0(unsigned int, len + 1);
> +       if (!new_list)
> +               return -1;
> +
> +       memcpy(new_list, lst, sizeof(unsigned int) * len);
> +
> +       if (g_str_equal(key, CONF_PREFERRED_TECHS)) {
> +               g_free(connman_settings.preferred_techs);
> +               connman_settings.preferred_techs = new_list;
> +               return 0;
> +       }
> +
> +       g_free(new_list);
> +
> +       return -1;
> +}
> +
>  unsigned int connman_timeout_input_request(void)
>  {
>         return connman_settings.timeout_inputreq;
> diff --git a/src/manager.c b/src/manager.c
> index 892d3a42..62f34c50 100644
> --- a/src/manager.c
> +++ b/src/manager.c
> @@ -34,6 +34,27 @@
>  static bool connman_state_idle;
>  static dbus_bool_t sessionmode;
>
> +static const char *tech_property_names[] = {
> +       "PreferredTechnologies",
> +       NULL,
> +};
> +
> +static void append_tech_list(DBusMessageIter *iter, void *user_data)
> +{
> +       unsigned int *tech_list = user_data;
> +       int i;
> +
> +       if (!tech_list)
> +               return;
> +
> +       for (i = 0; tech_list[i]; i++) {
> +               const char *s = __connman_service_type2string(tech_list[i]);
> +               if (!s)
> +                       continue;
> +               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &s);
> +       }
> +}
> +
>  static DBusMessage *get_properties(DBusConnection *conn,
>                                         DBusMessage *msg, void *data)
>  {
> @@ -41,6 +62,7 @@ static DBusMessage *get_properties(DBusConnection *conn,
>         DBusMessageIter array, dict;
>         dbus_bool_t offlinemode;
>         const char *str;
> +       int i;
>
>         DBG("conn %p", conn);
>
> @@ -64,6 +86,13 @@ static DBusMessage *get_properties(DBusConnection *conn,
>                                         DBUS_TYPE_BOOLEAN,
>                                         &sessionmode);
>
> +       for (i = 0; tech_property_names[i]; i++) {
> +               const char *name = tech_property_names[i];
> +               unsigned int *lst = connman_setting_get_uint_list(name);
> +               connman_dbus_dict_append_array(&dict, name, DBUS_TYPE_STRING,
> +                                               append_tech_list, lst);
> +       }
> +
>         connman_dbus_dict_close(&array, &dict);
>
>         return reply;
> @@ -110,6 +139,44 @@ static DBusMessage *set_property(DBusConnection *conn,
>
>                 dbus_message_iter_get_basic(&value, &sessionmode);
>
> +       } else if (g_str_equal(name, "PreferredTechnologies")) {
> +               unsigned int techs[MAX_CONNMAN_SERVICE_TYPES] = {};
> +               DBusMessageIter entry;
> +               int cnt;
> +
> +               if (type != DBUS_TYPE_ARRAY)
> +                       return __connman_error_invalid_arguments(msg);
> +
> +               dbus_message_iter_recurse(&value, &entry);
> +
> +               cnt = 0;
> +               while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) {
> +                       enum connman_service_type type;
> +                       const char *val;
> +                       dbus_message_iter_get_basic(&entry, &val);
> +                       dbus_message_iter_next(&entry);
> +                       int i;
> +
> +                       if (!val[0])
> +                               continue;
> +
> +                       type = __connman_service_string2type(val);
> +                       if (type == CONNMAN_SERVICE_TYPE_UNKNOWN)
> +                               return __connman_error_invalid_arguments(msg);
> +
> +                       if (cnt >= MAX_CONNMAN_SERVICE_TYPES)
> +                               return __connman_error_invalid_arguments(msg);
> +
> +                       /* check for duplicates */
> +                       for (i = 0; i < cnt; i++) {
> +                               if (type == techs[i])
> +                                       return __connman_error_invalid_arguments(msg);
> +                       }
> +
> +                       techs[cnt++] = type;
> +               }
> +
> +               connman_setting_set_uint_list(name, techs, cnt);
>         } else
>                 return __connman_error_invalid_property(msg);
>
> diff --git a/tools/ip6tables-test b/tools/ip6tables-test
> new file mode 100755
> index 0000000000000000000000000000000000000000..1fd564e36a6d1988dde34b0ae15b1c21167f30db
> GIT binary patch
> literal 71344
> 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
> TF{xg&{0CP$&X0N-yi4=nAA-p|
>
> literal 0
> HcmV?d00001
>
> --
> 2.45.2
>
diff mbox series

Patch

diff --git a/doc/connman.conf.5.in b/doc/connman.conf.5.in
index 3eb240f5..c8ce8eb6 100644
--- a/doc/connman.conf.5.in
+++ b/doc/connman.conf.5.in
@@ -101,6 +101,8 @@  with state 'ready' or with a non-preferred type; a service
 of a preferred technology type in state 'online' will get
 the default route when compared to either a non-preferred
 type or a preferred type further down in the list.
+This property can be read and set over DBus as well, on
+the 'net.connman.Manager' DBus interface.
 .TP
 .BI NetworkInterfaceBlacklist= interface\fR[,...]
 List of blacklisted network interfaces separated by ",".
diff --git a/doc/manager-api.txt b/doc/manager-api.txt
index 6eaa0a38..3be9cffc 100644
--- a/doc/manager-api.txt
+++ b/doc/manager-api.txt
@@ -319,3 +319,16 @@  Properties	string State [readonly]
 			and does not affect ConnMan in any way.
 
 			The default value is false.
+
+		array{string} PreferredTechnologies [readwrite] [experminental]
+
+			This property is the same one that is defined in
+			/etc/connman/main.conf. It controls the order of
+			preferred technologies (e.g. wifi, cellular) at
+			runtime.
+			Changing it here will not have an immediate effect.
+			It's only when connman gets triggered via service changes
+			that this gets taken into consideration. Or, when it's
+			triggered via manual connect/disconnect of services.
+
+			The default value is defined in /etc/connman/main.conf.
diff --git a/include/setting.h b/include/setting.h
index 920e6754..6a575dc4 100644
--- a/include/setting.h
+++ b/include/setting.h
@@ -33,6 +33,8 @@  unsigned int connman_setting_get_uint(const char *key);
 char *connman_setting_get_string(const char *key);
 char **connman_setting_get_string_list(const char *key);
 unsigned int *connman_setting_get_uint_list(const char *key);
+int connman_setting_set_uint_list(const char *key, const unsigned int *lst,
+                                  int len);
 
 unsigned int connman_timeout_input_request(void);
 unsigned int connman_timeout_browser_launch(void);
diff --git a/src/main.c b/src/main.c
index f5da979b..7858b967 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1122,6 +1122,28 @@  unsigned int *connman_setting_get_uint_list(const char *key)
 	return NULL;
 }
 
+int connman_setting_set_uint_list(const char *key, const unsigned int *lst,
+				  int len)
+{
+	unsigned int *new_list;
+
+	new_list = g_try_new0(unsigned int, len + 1);
+	if (!new_list)
+		return -1;
+
+	memcpy(new_list, lst, sizeof(unsigned int) * len);
+
+	if (g_str_equal(key, CONF_PREFERRED_TECHS)) {
+		g_free(connman_settings.preferred_techs);
+		connman_settings.preferred_techs = new_list;
+		return 0;
+	}
+
+	g_free(new_list);
+
+	return -1;
+}
+
 unsigned int connman_timeout_input_request(void)
 {
 	return connman_settings.timeout_inputreq;
diff --git a/src/manager.c b/src/manager.c
index 892d3a42..62f34c50 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -34,6 +34,27 @@ 
 static bool connman_state_idle;
 static dbus_bool_t sessionmode;
 
+static const char *tech_property_names[] = {
+	"PreferredTechnologies",
+	NULL,
+};
+
+static void append_tech_list(DBusMessageIter *iter, void *user_data)
+{
+	unsigned int *tech_list = user_data;
+	int i;
+
+	if (!tech_list)
+		return;
+
+	for (i = 0; tech_list[i]; i++) {
+		const char *s = __connman_service_type2string(tech_list[i]);
+		if (!s)
+			continue;
+		dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &s);
+	}
+}
+
 static DBusMessage *get_properties(DBusConnection *conn,
 					DBusMessage *msg, void *data)
 {
@@ -41,6 +62,7 @@  static DBusMessage *get_properties(DBusConnection *conn,
 	DBusMessageIter array, dict;
 	dbus_bool_t offlinemode;
 	const char *str;
+	int i;
 
 	DBG("conn %p", conn);
 
@@ -64,6 +86,13 @@  static DBusMessage *get_properties(DBusConnection *conn,
 					DBUS_TYPE_BOOLEAN,
 					&sessionmode);
 
+	for (i = 0; tech_property_names[i]; i++) {
+		const char *name = tech_property_names[i];
+		unsigned int *lst = connman_setting_get_uint_list(name);
+		connman_dbus_dict_append_array(&dict, name, DBUS_TYPE_STRING,
+						append_tech_list, lst);
+	}
+
 	connman_dbus_dict_close(&array, &dict);
 
 	return reply;
@@ -110,6 +139,44 @@  static DBusMessage *set_property(DBusConnection *conn,
 
 		dbus_message_iter_get_basic(&value, &sessionmode);
 
+	} else if (g_str_equal(name, "PreferredTechnologies")) {
+		unsigned int techs[MAX_CONNMAN_SERVICE_TYPES] = {};
+		DBusMessageIter entry;
+		int cnt;
+
+		if (type != DBUS_TYPE_ARRAY)
+			return __connman_error_invalid_arguments(msg);
+
+		dbus_message_iter_recurse(&value, &entry);
+
+		cnt = 0;
+		while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) {
+			enum connman_service_type type;
+			const char *val;
+			dbus_message_iter_get_basic(&entry, &val);
+			dbus_message_iter_next(&entry);
+			int i;
+
+			if (!val[0])
+				continue;
+
+			type = __connman_service_string2type(val);
+			if (type == CONNMAN_SERVICE_TYPE_UNKNOWN)
+				return __connman_error_invalid_arguments(msg);
+
+			if (cnt >= MAX_CONNMAN_SERVICE_TYPES)
+				return __connman_error_invalid_arguments(msg);
+
+			/* check for duplicates */
+			for (i = 0; i < cnt; i++) {
+				if (type == techs[i])
+					return __connman_error_invalid_arguments(msg);
+			}
+
+			techs[cnt++] = type;
+		}
+
+		connman_setting_set_uint_list(name, techs, cnt);
 	} else
 		return __connman_error_invalid_property(msg);
 
diff --git a/tools/ip6tables-test b/tools/ip6tables-test
new file mode 100755
index 0000000000000000000000000000000000000000..1fd564e36a6d1988dde34b0ae15b1c21167f30db