diff --git a/connman/src/service.c b/connman/src/service.c index 82cf39ef5..6fe9ef3a2 100644 --- a/connman/src/service.c +++ b/connman/src/service.c @@ -745,9 +745,16 @@ void __connman_service_split_routing_changed(struct connman_service *service) void __connman_service_set_split_routing(struct connman_service *service, bool value) { + bool change; + if (service->type != CONNMAN_SERVICE_TYPE_VPN) return; + DBG("%p/%s value %s", service, service->identifier, + value ? "true" : "false"); + + change = service->do_split_routing != value; + service->do_split_routing = value; if (service->do_split_routing) @@ -755,6 +762,19 @@ void __connman_service_set_split_routing(struct connman_service *service, else service->order = 10; + /* + * Change IPv6 on the VPN transport when split routing value changes + * on a connected IPv4 VPN. + */ + if (connman_provider_get_family(service->provider) == AF_INET && + change && is_connected(service)) { + if (__connman_provider_toggle_transport_ipv6(service->provider, + !value)) + DBG("cannot toggle IPv6 on transport of service %p" + "provider %p", service, + service->provider); + } + /* * In order to make sure the value is propagated also when loading the * VPN service signal the value regardless of the value change.