diff options
-rw-r--r-- | doc/connman.conf.5.in | 8 | ||||
-rw-r--r-- | include/setting.h | 1 | ||||
-rw-r--r-- | src/main.c | 67 | ||||
-rw-r--r-- | src/main.conf | 9 | ||||
-rw-r--r-- | src/service.c | 22 |
5 files changed, 88 insertions, 19 deletions
diff --git a/doc/connman.conf.5.in b/doc/connman.conf.5.in index a90c2291..19e6e0c0 100644 --- a/doc/connman.conf.5.in +++ b/doc/connman.conf.5.in @@ -167,6 +167,14 @@ transitioned to ONLINE state. If this setting is false, the default service will remain in READY state. Default value is true. .TP +.BI OnlineCheckInitialInterval= secs, OnlineCheckMaxInterval= secs +Range of intervals between two online check requests. +When an online check request fails, another one is triggered after a +longer interval. The intervals follow the power of two series of numbers +between OnlineCheckInitialInterval and OnlineCheckMaxInterval. +Default range is [1, 12], corresponding to the following intervals, in +seconds: 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121 and 144. +.TP .BI AutoConnectRoamingServices=true\ \fR|\fB\ false Automatically connect roaming services. This is not recommended unless you know you won't have any billing problem. diff --git a/include/setting.h b/include/setting.h index a8820217..8d2c37b7 100644 --- a/include/setting.h +++ b/include/setting.h @@ -29,6 +29,7 @@ extern "C" { #endif bool connman_setting_get_bool(const char *key); +unsigned int connman_setting_get_uint(const char *key); char **connman_setting_get_string_list(const char *key); unsigned int *connman_setting_get_uint_list(const char *key); @@ -44,6 +44,14 @@ #define DEFAULT_INPUT_REQUEST_TIMEOUT (120 * 1000) #define DEFAULT_BROWSER_LAUNCH_TIMEOUT (300 * 1000) +/* + * We set the integer to 1 sec so that we have a chance to get + * necessary IPv6 router advertisement messages that might have + * DNS data etc. + */ +#define DEFAULT_ONLINE_CHECK_INITIAL_INTERVAL 1 +#define DEFAULT_ONLINE_CHECK_MAX_INTERVAL 12 + #define MAINFILE "main.conf" #define CONFIGMAINFILE CONFIGDIR "/" MAINFILE @@ -88,6 +96,8 @@ static struct { bool enable_6to4; char *vendor_class_id; bool enable_online_check; + unsigned int online_check_initial_interval; + unsigned int online_check_max_interval; bool auto_connect_roaming_services; bool acd; bool use_gateways_as_timeservers; @@ -110,6 +120,8 @@ static struct { .enable_6to4 = false, .vendor_class_id = NULL, .enable_online_check = true, + .online_check_initial_interval = DEFAULT_ONLINE_CHECK_INITIAL_INTERVAL, + .online_check_max_interval = DEFAULT_ONLINE_CHECK_MAX_INTERVAL, .auto_connect_roaming_services = false, .acd = false, .use_gateways_as_timeservers = false, @@ -133,6 +145,8 @@ static struct { #define CONF_ENABLE_6TO4 "Enable6to4" #define CONF_VENDOR_CLASS_ID "VendorClassID" #define CONF_ENABLE_ONLINE_CHECK "EnableOnlineCheck" +#define CONF_ONLINE_CHECK_INITIAL_INTERVAL "OnlineCheckInitialInterval" +#define CONF_ONLINE_CHECK_MAX_INTERVAL "OnlineCheckMaxInterval" #define CONF_AUTO_CONNECT_ROAMING_SERVICES "AutoConnectRoamingServices" #define CONF_ACD "AddressConflictDetection" #define CONF_USE_GATEWAYS_AS_TIMESERVERS "UseGatewaysAsTimeservers" @@ -156,6 +170,8 @@ static const char *supported_options[] = { CONF_ENABLE_6TO4, CONF_VENDOR_CLASS_ID, CONF_ENABLE_ONLINE_CHECK, + CONF_ONLINE_CHECK_INITIAL_INTERVAL, + CONF_ONLINE_CHECK_MAX_INTERVAL, CONF_AUTO_CONNECT_ROAMING_SERVICES, CONF_ACD, CONF_USE_GATEWAYS_AS_TIMESERVERS, @@ -283,7 +299,7 @@ static void parse_config(GKeyFile *config) char **tethering; char *vendor_class_id; gsize len; - int timeout; + int integer; if (!config) { connman_settings.auto_connect = @@ -370,17 +386,17 @@ static void parse_config(GKeyFile *config) g_clear_error(&error); - timeout = g_key_file_get_integer(config, "General", + integer = g_key_file_get_integer(config, "General", CONF_TIMEOUT_INPUTREQ, &error); - if (!error && timeout >= 0) - connman_settings.timeout_inputreq = timeout * 1000; + if (!error && integer >= 0) + connman_settings.timeout_inputreq = integer * 1000; g_clear_error(&error); - timeout = g_key_file_get_integer(config, "General", + integer = g_key_file_get_integer(config, "General", CONF_TIMEOUT_BROWSERLAUNCH, &error); - if (!error && timeout >= 0) - connman_settings.timeout_browserlaunch = timeout * 1000; + if (!error && integer >= 0) + connman_settings.timeout_browserlaunch = integer * 1000; g_clear_error(&error); @@ -458,6 +474,32 @@ static void parse_config(GKeyFile *config) g_clear_error(&error); + integer = g_key_file_get_integer(config, "General", + CONF_ONLINE_CHECK_INITIAL_INTERVAL, &error); + if (!error && integer >= 0) + connman_settings.online_check_initial_interval = integer; + + g_clear_error(&error); + + integer = g_key_file_get_integer(config, "General", + CONF_ONLINE_CHECK_MAX_INTERVAL, &error); + if (!error && integer >= 0) + connman_settings.online_check_max_interval = integer; + + g_clear_error(&error); + + if (connman_settings.online_check_initial_interval < 1 || + connman_settings.online_check_initial_interval > + connman_settings.online_check_max_interval) { + connman_warn("Incorrect online check intervals [%u, %u]", + connman_settings.online_check_initial_interval, + connman_settings.online_check_max_interval); + connman_settings.online_check_initial_interval = + DEFAULT_ONLINE_CHECK_INITIAL_INTERVAL; + connman_settings.online_check_max_interval = + DEFAULT_ONLINE_CHECK_MAX_INTERVAL; + } + boolean = __connman_config_get_bool(config, "General", CONF_AUTO_CONNECT_ROAMING_SERVICES, &error); if (!error) @@ -699,6 +741,17 @@ bool connman_setting_get_bool(const char *key) return false; } +unsigned int connman_setting_get_uint(const char *key) +{ + if (g_str_equal(key, CONF_ONLINE_CHECK_INITIAL_INTERVAL)) + return connman_settings.online_check_initial_interval; + + if (g_str_equal(key, CONF_ONLINE_CHECK_MAX_INTERVAL)) + return connman_settings.online_check_max_interval; + + return 0; +} + char **connman_setting_get_string_list(const char *key) { if (g_str_equal(key, CONF_PREF_TIMESERVERS)) diff --git a/src/main.conf b/src/main.conf index 14965e12..83cd20f6 100644 --- a/src/main.conf +++ b/src/main.conf @@ -125,6 +125,15 @@ # Default value is true. # EnableOnlineCheck = false +# Range of intervals between two online check requests. +# When an online check request fails, another one is triggered after a +# longer interval. The intervals follow the power of two series of numbers +# between OnlineCheckInitialInterval and OnlineCheckMaxInterval. +# Default range is [1, 12], corresponding to the following intervals, in +# seconds: 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121 and 144. +# OnlineCheckInitialInterval = 1 +# OnlineCheckMaxInterval = 12 + # List of technologies with AutoConnect = true which are always connected # regardless of PreferredTechnologies setting. Default value is empty and # will connect a technology only if it is at a higher preference than any diff --git a/src/service.c b/src/service.c index 69f0a511..99a52022 100644 --- a/src/service.c +++ b/src/service.c @@ -54,6 +54,8 @@ static unsigned int autoconnect_id = 0; static unsigned int vpn_autoconnect_id = 0; static struct connman_service *current_default = NULL; static bool services_dirty = false; +static unsigned int online_check_initial_interval = 0; +static unsigned int online_check_max_interval = 0; struct connman_stats { bool valid; @@ -1448,6 +1450,10 @@ static void start_online_check(struct connman_service *service, "Default service remains in READY state."); return; } + online_check_initial_interval = + connman_setting_get_uint("OnlineCheckInitialInterval"); + online_check_max_interval = + connman_setting_get_uint("OnlineCheckMaxInterval"); if (type != CONNMAN_IPCONFIG_TYPE_IPV4 || check_proxy_setup(service)) { cancel_online_check(service); @@ -3559,14 +3565,6 @@ int __connman_service_reset_ipconfig(struct connman_service *service, return err; } -/* - * We set the timeout to 1 sec so that we have a chance to get - * necessary IPv6 router advertisement messages that might have - * DNS data etc. - */ -#define ONLINE_CHECK_INITIAL_INTERVAL 1 -#define ONLINE_CHECK_MAX_INTERVAL 12 - void __connman_service_wispr_start(struct connman_service *service, enum connman_ipconfig_type type) { @@ -3574,10 +3572,10 @@ void __connman_service_wispr_start(struct connman_service *service, if (type == CONNMAN_IPCONFIG_TYPE_IPV4) service->online_check_interval_ipv4 = - ONLINE_CHECK_INITIAL_INTERVAL; + online_check_initial_interval; else service->online_check_interval_ipv6 = - ONLINE_CHECK_INITIAL_INTERVAL; + online_check_initial_interval; __connman_wispr_start(service, type); } @@ -6279,9 +6277,9 @@ int __connman_service_online_check_failed(struct connman_service *service, redo_func, connman_service_ref(service)); /* Increment the interval for the next time, set a maximum timeout of - * ONLINE_CHECK_MAX_INTERVAL * ONLINE_CHECK_MAX_INTERVAL seconds. + * online_check_max_interval seconds * online_check_max_interval seconds. */ - if (*interval < ONLINE_CHECK_MAX_INTERVAL) + if (*interval < online_check_max_interval) (*interval)++; return EAGAIN; |