diff options
author | Daniel Wagner <wagi@monom.org> | 2021-04-05 20:14:31 +0200 |
---|---|---|
committer | Daniel Wagner <wagi@monom.org> | 2021-04-18 12:08:02 +0200 |
commit | 561f318003c14fff56720309b6c9dfdbceb8dd87 (patch) | |
tree | 1295d337c3897434f7475eee17ac58040202b501 | |
parent | a416630c564980b44a60eb8b76ffd2cd4b26fd75 (diff) | |
download | connman-561f318003c14fff56720309b6c9dfdbceb8dd87.tar.gz |
service: Teach autoconnect algorithm native mode
When network supports native auto connnect mode do not use the internal
auto connect algorithm for this network.
Introduce new CONNMAN_SERVICE_CONNECT_REASON_NATIVE and track the
service connection reason with it.
-rw-r--r-- | include/service.h | 1 | ||||
-rw-r--r-- | src/service.c | 84 |
2 files changed, 56 insertions, 29 deletions
diff --git a/include/service.h b/include/service.h index 4a129b49..8f6b36b4 100644 --- a/include/service.h +++ b/include/service.h @@ -94,6 +94,7 @@ enum connman_service_connect_reason { CONNMAN_SERVICE_CONNECT_REASON_AUTO = 1, CONNMAN_SERVICE_CONNECT_REASON_USER = 2, CONNMAN_SERVICE_CONNECT_REASON_SESSION = 3, + CONNMAN_SERVICE_CONNECT_REASON_NATIVE = 4, }; struct connman_service; diff --git a/src/service.c b/src/service.c index 5bb7f125..a16350c6 100644 --- a/src/service.c +++ b/src/service.c @@ -195,6 +195,8 @@ static const char *reason2string(enum connman_service_connect_reason reason) return "auto"; case CONNMAN_SERVICE_CONNECT_REASON_SESSION: return "session"; + case CONNMAN_SERVICE_CONNECT_REASON_NATIVE: + return "native"; } return "unknown"; @@ -3491,6 +3493,13 @@ static void do_auto_connect(struct connman_service *service, return; /* + * Do not use the builtin auto connect, instead rely on the + * native auto connect feature of the service. + */ + if (service->connect_reason == CONNMAN_SERVICE_CONNECT_REASON_NATIVE) + return; + + /* * Run service auto connect for other than VPN services. Afterwards * start also VPN auto connect process. */ @@ -4215,6 +4224,12 @@ static bool auto_connect_service(GList *services, continue; } + if (service->connect_reason == + CONNMAN_SERVICE_CONNECT_REASON_NATIVE) { + DBG("service %p uses native autonnect, skip", service); + continue; + } + if (service->pending || is_connecting(service->state) || is_connected(service->state)) { @@ -6712,6 +6727,12 @@ int __connman_service_connect(struct connman_service *service, __connman_service_clear_error(service); + if (__connman_network_native_autoconnect(service->network) && + service->autoconnect) { + DBG("service %p switch connecting reason to native", service); + reason = CONNMAN_SERVICE_CONNECT_REASON_NATIVE; + } + err = service_connect(service); DBG("service %p err %d", service, err); @@ -7340,39 +7361,44 @@ static void update_from_network(struct connman_service *service, static void trigger_autoconnect(struct connman_service *service) { struct connman_device *device; + bool native; - connman_network_set_autoconnect(service->network, - service->favorite && service->autoconnect); - if (service->favorite) { - device = connman_network_get_device(service->network); - if (device && !connman_device_get_scanning(device, - CONNMAN_SERVICE_TYPE_UNKNOWN)) { - - switch (service->type) { - case CONNMAN_SERVICE_TYPE_UNKNOWN: - case CONNMAN_SERVICE_TYPE_SYSTEM: - case CONNMAN_SERVICE_TYPE_P2P: - break; + if (!service->favorite) + return; - case CONNMAN_SERVICE_TYPE_GADGET: - case CONNMAN_SERVICE_TYPE_ETHERNET: - if (service->autoconnect) { - __connman_service_connect(service, - CONNMAN_SERVICE_CONNECT_REASON_AUTO); - break; - } + native = __connman_network_native_autoconnect(service->network); + if (native && service->autoconnect) { + DBG("trigger native autoconnect"); + connman_network_set_autoconnect(service->network, true); + return; + } - /* fall through */ - case CONNMAN_SERVICE_TYPE_BLUETOOTH: - case CONNMAN_SERVICE_TYPE_GPS: - case CONNMAN_SERVICE_TYPE_VPN: - case CONNMAN_SERVICE_TYPE_WIFI: - case CONNMAN_SERVICE_TYPE_CELLULAR: - do_auto_connect(service, - CONNMAN_SERVICE_CONNECT_REASON_AUTO); - break; - } + device = connman_network_get_device(service->network); + if (device && connman_device_get_scanning(device, CONNMAN_SERVICE_TYPE_UNKNOWN)) + return; + + switch (service->type) { + case CONNMAN_SERVICE_TYPE_UNKNOWN: + case CONNMAN_SERVICE_TYPE_SYSTEM: + case CONNMAN_SERVICE_TYPE_P2P: + break; + + case CONNMAN_SERVICE_TYPE_GADGET: + case CONNMAN_SERVICE_TYPE_ETHERNET: + if (service->autoconnect) { + __connman_service_connect(service, + CONNMAN_SERVICE_CONNECT_REASON_AUTO); + break; } + + /* fall through */ + case CONNMAN_SERVICE_TYPE_BLUETOOTH: + case CONNMAN_SERVICE_TYPE_GPS: + case CONNMAN_SERVICE_TYPE_VPN: + case CONNMAN_SERVICE_TYPE_WIFI: + case CONNMAN_SERVICE_TYPE_CELLULAR: + do_auto_connect(service, CONNMAN_SERVICE_CONNECT_REASON_AUTO); + break; } } |