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

248 lines
11 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.
Upstream-Status: Inappropriate [DEY specific]
Signed-off-by: Javier Viguera <javier.viguera@digi.com>
Signed-off-by: Gabriel Valcazar <gabriel.valcazar@digi.com>
---
src/core/nm-config-data.c | 37 +++++++++++++++++++++++++++++++++++++
src/core/nm-config-data.h | 2 ++
src/core/nm-config.c | 15 +++++++++++++++
src/core/nm-config.h | 1 +
src/core/nm-connectivity.c | 12 +++++++++++-
5 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/src/core/nm-config-data.c b/src/core/nm-config-data.c
index 468e56b821..9e986c7233 100644
--- a/src/core/nm-config-data.c
+++ b/src/core/nm-config-data.c
@@ -62,6 +62,7 @@ NM_GOBJECT_PROPERTIES_DEFINE_BASE(PROP_CONFIG_MAIN_FILE,
PROP_CONNECTIVITY_ENABLED,
PROP_CONNECTIVITY_URI,
PROP_CONNECTIVITY_INTERVAL,
+ PROP_CONNECTIVITY_TIMEOUT,
PROP_CONNECTIVITY_RESPONSE,
PROP_NO_AUTO_DEFAULT, );
@@ -86,6 +87,7 @@ typedef struct {
char *uri;
char *response;
guint interval;
+ guint timeout;
} connectivity;
int autoconnect_retries_default;
@@ -304,6 +306,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)
{
@@ -2006,6 +2016,8 @@ nm_config_data_diff(NMConfigData *old_data, NMConfigData *new_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)
|| !nm_streq0(nm_config_data_get_connectivity_uri(old_data),
nm_config_data_get_connectivity_uri(new_data))
|| !nm_streq0(nm_config_data_get_connectivity_response(old_data),
@@ -2079,6 +2091,9 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
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;
@@ -2221,6 +2236,19 @@ constructed(GObject *object)
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,
@@ -2420,6 +2448,15 @@ nm_config_data_class_init(NMConfigDataClass *config_class)
0,
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,
"",
diff --git a/src/core/nm-config-data.h b/src/core/nm-config-data.h
index 9e7a50fc24..868e0ee4c1 100644
--- a/src/core/nm-config-data.h
+++ b/src/core/nm-config-data.h
@@ -47,6 +47,7 @@ typedef enum {
#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"
@@ -172,6 +173,7 @@ char **nm_config_data_get_plugins(const NMConfigData *config_data, gboolean
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/core/nm-config.c b/src/core/nm-config.c
index 43eb364699..20c51cb75c 100644
--- a/src/core/nm-config.c
+++ b/src/core/nm-config.c
@@ -47,6 +47,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
@@ -481,6 +482,7 @@ _nm_config_cmd_line_options_clear(NMConfigCmdLineOptions *cli)
nm_clear_g_free(&cli->connectivity_uri);
nm_clear_g_free(&cli->connectivity_response);
cli->connectivity_interval = -1;
+ cli->connectivity_timeout = -1;
cli->first_start = FALSE;
}
@@ -504,6 +506,7 @@ _nm_config_cmd_line_options_copy(const NMConfigCmdLineOptions *cli, NMConfigCmdL
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;
}
@@ -654,6 +657,13 @@ nm_config_cmd_line_options_add_to_entries(NMConfigCmdLineOptions *cli, GOptionCo
&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,
@@ -1415,6 +1425,11 @@ read_entire_config(const NMConfigCmdLineOptions *cli,
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,
diff --git a/src/core/nm-config.h b/src/core/nm-config.h
index e65582c34a..8cb00e72bd 100644
--- a/src/core/nm-config.h
+++ b/src/core/nm-config.h
@@ -28,6 +28,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 */
typedef struct NMConfigCmdLineOptions NMConfigCmdLineOptions;
diff --git a/src/core/nm-connectivity.c b/src/core/nm-connectivity.c
index 15dc31aa24..f25831e300 100644
--- a/src/core/nm-connectivity.c
+++ b/src/core/nm-connectivity.c
@@ -108,6 +108,7 @@ typedef struct {
CList completed_handles_lst_head;
NMConfig *config;
ConConfig *con_config;
+ guint timeout;
guint interval;
bool enabled : 1;
@@ -714,6 +715,7 @@ _idle_cb(gpointer user_data)
static void
do_curl_request(NMConnectivityCheckHandle *cb_data, const char *hosts)
{
+ NMConnectivityPrivate *priv = NM_CONNECTIVITY_GET_PRIVATE (cb_data->self);
CURLM *mhandle;
CURL *ehandle;
long resolve;
@@ -738,7 +740,7 @@ do_curl_request(NMConnectivityCheckHandle *cb_data, const char *hosts)
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_source = nm_g_timeout_add_seconds_source(20, _timeout_cb, cb_data);
+ cb_data->timeout_source = nm_g_timeout_add_seconds_source(priv->timeout, _timeout_cb, cb_data);
curl_multi_setopt(mhandle, CURLMOPT_SOCKETFUNCTION, multi_socket_cb);
curl_multi_setopt(mhandle, CURLMOPT_SOCKETDATA, cb_data);
@@ -1226,6 +1228,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;
@@ -1312,6 +1315,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);
}