meta-digi/meta-digi-dey/recipes-connectivity/networkmanager/networkmanager/0002-connectivity-add-confi...

224 lines
10 KiB
Diff

From: Javier Viguera <javier.viguera@digi.com>
Date: Tue, 14 May 2019 16:44:03 +0200
Subject: [PATCH] connectivity: add config option for response timeout
Instead of the 20 seconds hardcoded currently in the code, allow to
configure the response timeout in the connectivity section of the main
NetworkManager config file.
Signed-off-by: Javier Viguera <javier.viguera@digi.com>
---
src/nm-config-data.c | 25 +++++++++++++++++++++++++
src/nm-config-data.h | 2 ++
src/nm-config.c | 6 ++++++
src/nm-config.h | 1 +
src/nm-connectivity.c | 12 +++++++++++-
5 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/src/nm-config-data.c b/src/nm-config-data.c
index 608b7e5..393f723 100644
--- a/src/nm-config-data.c
+++ b/src/nm-config-data.c
@@ -66,6 +66,7 @@ NM_GOBJECT_PROPERTIES_DEFINE_BASE (
PROP_CONNECTIVITY_ENABLED,
PROP_CONNECTIVITY_URI,
PROP_CONNECTIVITY_INTERVAL,
+ PROP_CONNECTIVITY_TIMEOUT,
PROP_CONNECTIVITY_RESPONSE,
PROP_NO_AUTO_DEFAULT,
);
@@ -91,6 +92,7 @@ typedef struct {
char *uri;
char *response;
guint interval;
+ guint timeout;
} connectivity;
int autoconnect_retries_default;
@@ -268,6 +270,14 @@ nm_config_data_get_connectivity_interval (const NMConfigData *self)
return NM_CONFIG_DATA_GET_PRIVATE (self)->connectivity.interval;
}
+guint
+nm_config_data_get_connectivity_timeout (const NMConfigData *self)
+{
+ g_return_val_if_fail (self, 0);
+
+ return NM_CONFIG_DATA_GET_PRIVATE (self)->connectivity.timeout;
+}
+
const char *
nm_config_data_get_connectivity_response (const NMConfigData *self)
{
@@ -1538,6 +1548,7 @@ nm_config_data_diff (NMConfigData *old_data, NMConfigData *new_data)
if ( nm_config_data_get_connectivity_enabled (old_data) != nm_config_data_get_connectivity_enabled (new_data)
|| nm_config_data_get_connectivity_interval (old_data) != nm_config_data_get_connectivity_interval (new_data)
+ || nm_config_data_get_connectivity_timeout (old_data) != nm_config_data_get_connectivity_timeout (new_data)
|| g_strcmp0 (nm_config_data_get_connectivity_uri (old_data), nm_config_data_get_connectivity_uri (new_data))
|| g_strcmp0 (nm_config_data_get_connectivity_response (old_data), nm_config_data_get_connectivity_response (new_data)))
changes |= NM_CONFIG_CHANGE_CONNECTIVITY;
@@ -1586,6 +1597,9 @@ get_property (GObject *object,
case PROP_CONNECTIVITY_INTERVAL:
g_value_set_uint (value, nm_config_data_get_connectivity_interval (self));
break;
+ case PROP_CONNECTIVITY_TIMEOUT:
+ g_value_set_uint (value, nm_config_data_get_connectivity_timeout (self));
+ break;
case PROP_CONNECTIVITY_RESPONSE:
g_value_set_string (value, nm_config_data_get_connectivity_response (self));
break;
@@ -1705,6 +1719,11 @@ constructed (GObject *object)
priv->connectivity.interval = _nm_utils_ascii_str_to_int64 (str, 10, 0, G_MAXUINT, NM_CONFIG_DEFAULT_CONNECTIVITY_INTERVAL);
g_free (str);
+ /* On missing config value, fallback to the default value */
+ str = g_key_file_get_string (priv->keyfile, NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY, "timeout", NULL);
+ priv->connectivity.timeout = _nm_utils_ascii_str_to_int64 (str, 10, 1, G_MAXUINT, NM_CONFIG_DEFAULT_CONNECTIVITY_TIMEOUT);
+ g_free (str);
+
priv->dns_mode = nm_strstrip (g_key_file_get_string (priv->keyfile,
NM_CONFIG_KEYFILE_GROUP_MAIN,
NM_CONFIG_KEYFILE_KEY_MAIN_DNS,
@@ -1873,6 +1892,12 @@ nm_config_data_class_init (NMConfigDataClass *config_class)
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
+ obj_properties[PROP_CONNECTIVITY_TIMEOUT] =
+ g_param_spec_uint(NM_CONFIG_DATA_CONNECTIVITY_TIMEOUT, "", "",
+ 0, G_MAXUINT, 0,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
+
obj_properties[PROP_CONNECTIVITY_RESPONSE] =
g_param_spec_string (NM_CONFIG_DATA_CONNECTIVITY_RESPONSE, "", "",
NULL,
diff --git a/src/nm-config-data.h b/src/nm-config-data.h
index c043aa3..78b2818 100644
--- a/src/nm-config-data.h
+++ b/src/nm-config-data.h
@@ -35,6 +35,7 @@
#define NM_CONFIG_DATA_CONNECTIVITY_ENABLED "connectivity-enabled"
#define NM_CONFIG_DATA_CONNECTIVITY_URI "connectivity-uri"
#define NM_CONFIG_DATA_CONNECTIVITY_INTERVAL "connectivity-interval"
+#define NM_CONFIG_DATA_CONNECTIVITY_TIMEOUT "connectivity-timeout"
#define NM_CONFIG_DATA_CONNECTIVITY_RESPONSE "connectivity-response"
#define NM_CONFIG_DATA_NO_AUTO_DEFAULT "no-auto-default"
#define NM_CONFIG_DATA_DNS_MODE "dns"
@@ -161,6 +162,7 @@ char **nm_config_data_get_plugins (const NMConfigData *config_data, gboolean all
gboolean nm_config_data_get_connectivity_enabled (const NMConfigData *config_data);
const char *nm_config_data_get_connectivity_uri (const NMConfigData *config_data);
guint nm_config_data_get_connectivity_interval (const NMConfigData *config_data);
+guint nm_config_data_get_connectivity_timeout (const NMConfigData *config_data);
const char *nm_config_data_get_connectivity_response (const NMConfigData *config_data);
int nm_config_data_get_autoconnect_retries_default (const NMConfigData *config_data);
diff --git a/src/nm-config.c b/src/nm-config.c
index 3e82bde..1c7dbd7 100644
--- a/src/nm-config.c
+++ b/src/nm-config.c
@@ -59,6 +59,7 @@ struct NMConfigCmdLineOptions {
* set or not via GOptionEntry
*/
int connectivity_interval;
+ int connectivity_timeout;
char *connectivity_response;
/* @first_start is not provided by command line. It is a convenient hack
@@ -483,6 +484,7 @@ _nm_config_cmd_line_options_clear (NMConfigCmdLineOptions *cli)
g_clear_pointer (&cli->connectivity_uri, g_free);
g_clear_pointer (&cli->connectivity_response, g_free);
cli->connectivity_interval = -1;
+ cli->connectivity_timeout = -1;
cli->first_start = FALSE;
}
@@ -506,6 +508,7 @@ _nm_config_cmd_line_options_copy (const NMConfigCmdLineOptions *cli, NMConfigCmd
dst->connectivity_uri = g_strdup (cli->connectivity_uri);
dst->connectivity_response = g_strdup (cli->connectivity_response);
dst->connectivity_interval = cli->connectivity_interval;
+ dst->connectivity_timeout = cli->connectivity_timeout;
dst->first_start = cli->first_start;
}
@@ -585,6 +588,7 @@ nm_config_cmd_line_options_add_to_entries (NMConfigCmdLineOptions *cli,
/* These three are hidden for now, and should eventually just go away. */
{ "connectivity-uri", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &cli->connectivity_uri, N_("An http(s) address for checking internet connectivity"), "http://example.com" },
{ "connectivity-interval", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_INT, &cli->connectivity_interval, N_("The interval between connectivity checks (in seconds)"), G_STRINGIFY (NM_CONFIG_DEFAULT_CONNECTIVITY_INTERVAL) },
+ { "connectivity-timeout", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_INT, &cli->connectivity_timeout, N_("The timeout for the connectivity checks (in seconds)"), G_STRINGIFY (NM_CONFIG_DEFAULT_CONNECTIVITY_TIMEOUT) },
{ "connectivity-response", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_STRING, &cli->connectivity_response, N_("The expected start of the response"), NM_CONFIG_DEFAULT_CONNECTIVITY_RESPONSE },
{ 0 },
};
@@ -1301,6 +1305,8 @@ read_entire_config (const NMConfigCmdLineOptions *cli,
g_key_file_set_string (keyfile, NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY, "uri", cli->connectivity_uri);
if (cli->connectivity_interval >= 0)
g_key_file_set_integer (keyfile, NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY, "interval", cli->connectivity_interval);
+ if (cli->connectivity_timeout >= 0)
+ g_key_file_set_integer (keyfile, NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY, "timeout", cli->connectivity_timeout);
if (cli->connectivity_response && cli->connectivity_response[0])
g_key_file_set_string (keyfile, NM_CONFIG_KEYFILE_GROUP_CONNECTIVITY, "response", cli->connectivity_response);
}
diff --git a/src/nm-config.h b/src/nm-config.h
index 66f1b69..debdce7 100644
--- a/src/nm-config.h
+++ b/src/nm-config.h
@@ -39,6 +39,7 @@
#define NM_CONFIG_SIGNAL_CONFIG_CHANGED "config-changed"
#define NM_CONFIG_DEFAULT_CONNECTIVITY_INTERVAL 300
+#define NM_CONFIG_DEFAULT_CONNECTIVITY_TIMEOUT 20
#define NM_CONFIG_DEFAULT_CONNECTIVITY_RESPONSE "NetworkManager is online" /* NOT LOCALIZED */
#define NM_CONFIG_KEYFILE_LIST_SEPARATOR ','
diff --git a/src/nm-connectivity.c b/src/nm-connectivity.c
index aee6c57..274a909 100644
--- a/src/nm-connectivity.c
+++ b/src/nm-connectivity.c
@@ -121,6 +121,7 @@ typedef struct {
CList completed_handles_lst_head;
NMConfig *config;
ConConfig *con_config;
+ guint timeout;
guint interval;
bool enabled:1;
@@ -668,6 +669,7 @@ _idle_cb (gpointer user_data)
static void
do_curl_request (NMConnectivityCheckHandle *cb_data)
{
+ NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (cb_data->self);
CURLM *mhandle;
CURL *ehandle;
long resolve;
@@ -688,7 +690,7 @@ do_curl_request (NMConnectivityCheckHandle *cb_data)
cb_data->concheck.curl_mhandle = mhandle;
cb_data->concheck.curl_ehandle = ehandle;
cb_data->concheck.request_headers = curl_slist_append (NULL, "Connection: close");
- cb_data->timeout_id = g_timeout_add_seconds (20, _timeout_cb, cb_data);
+ cb_data->timeout_id = g_timeout_add_seconds (priv->timeout, _timeout_cb, cb_data);
curl_multi_setopt (mhandle, CURLMOPT_SOCKETFUNCTION, multi_socket_cb);
curl_multi_setopt (mhandle, CURLMOPT_SOCKETDATA, cb_data);
@@ -1079,6 +1081,7 @@ update_config (NMConnectivity *self, NMConfigData *config_data)
{
NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (self);
guint interval;
+ guint timeout;
gboolean enabled;
gboolean changed = FALSE;
const char *cur_uri = priv->con_config ? priv->con_config->uri : NULL;
@@ -1165,6 +1168,13 @@ update_config (NMConnectivity *self, NMConfigData *config_data)
changed = TRUE;
}
+ /* Set the timeout */
+ timeout = nm_config_data_get_connectivity_timeout (config_data);
+ if (priv->timeout != timeout) {
+ priv->timeout = timeout;
+ changed = TRUE;
+ }
+
if (changed)
g_signal_emit (self, signals[CONFIG_CHANGED], 0);
}