Manager hierarchy
=================

Service		org.chromium.flimflam
Interface	org.chromium.flimflam.Manager
Object path	/

Methods		dict GetProperties()

			Return the global system properties specified
			in the Properties section.

		void SetProperty(string name, variant value)

			Changes the value of the specified property. Only
			properties that are listed as read-write are
			changeable. On success a PropertyChanged signal
			will be emitted.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.InvalidProperty

		string GetState()

			Return the connection state of a system. The
			same value is return via the State property.

		object CreateProfile(string name)

			Create and add new profile with the specified
			identifier name.  The name should either be in the
			form ``name'' or ``~user/name'' where where ``user''
			is the login name of a user suitable for finding
			their home directory.  Both strings must contain
			only alpha-numeric ASCII characters.

			Profiles created without a user name are stored in
			a system directory readable only by the connection
			mananger.  Profiles created with a user name are
			stored in the user's home directory but readable
			only by the connection manager.

			If any existing profile is specified its contents
			are reset to a default (minimal) contents.  If the
			profile is already registered with a CreateProfile
			or PushProfile request then an error is returned.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.AlreadyExists

		object PushProfile(string name)

			Push the profile with the specified identifier
			onto the profile stack.  The profile must have
			previously been created with CreateProfile.
			The profile becomes the ``active profile'' that
			is searched first when loading data and to which
			updates are stored.

			A profile may be pushed only once.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.AlreadyExists

		object InsertUserProfile(string name, string user_hash)

			Add the profile with the specified identifier
			to the profile stack.  The profile must have
			previously been created with CreateProfile.
			The |user_hash| provided is assigned to the
			profile and is made visible as a property of
			the profile.

			A profile may be inserted or pushed only once.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.AlreadyExists

		object PopProfile(string name)

			Pop the top-most profile on the profile stack.
			Any profile beneath this profile becomes the
			``active profile''.  Any services using configuration
			from the popped profile are disconnected and the
			credentials invalidated (the next time
			credentials are needed they are loaded from the
			(new) active profile).

			The name must match the identifer of the active
			profile.  This is a safeguard against accidentally
			removing the wrong profile.

			Note it is valid to pop all profiles from the
			stack; in this state the connection manager does
			not write any state to persistent storage.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotFound
					 [service].Error.WrongState

		object PopAnyProfile()

			Like PopProfile but do not check the profile on
			the top of the stack; pop anything.

			Possible Errors: [service].Error.InvalidArguments

		object PopAllUserProfiles()

			Remove all user profiles from the stack of managed
			profiles leaving only default profiles if any exist.

		void RemoveProfile(string name)

			Remove the profile with specified identifier.

			The profile may not be resident on the stack.
			The default profile may not be removed.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.AlreadyExists

		void RequestScan(string type)

			Request a scan for each device of the specified
			technology.  If type is the string "" then a scan
			request is made for each technology.

			For WiFi devices this triggers a search for
			available WiFi networks.  When results are
			available, the Device.Networks property is
			updated and a PropertyChanged signal is issued.

			For cellular devices, this triggers a search for
			available cellular networks, which may take up to a
			minute or two to complete.  When the results are
			available, the Cellular.FoundNetworks property of
			each cellular device is set with the results.

			Possible Errors: [service].Error.InvalidArguments

		void EnableTechnology(string type)

			Enable all technologies of the specified type.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.InProgress
					 [service].Error.AlreadyEnabled
					 [service].Error.PermissionDenied

		void DisableTechnology(string type)

			Disable all technologies of the specified type.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.InProgress
					 [service].Error.AlreadyDisabled

		object ConfigureService(dict properties)

			Update the configuration of a service in memory
			and in the profile.  If no matching service exists
			in memory it is temporarily created to carry out
			this work and may be removed later.  The object
			path of the created service is returned.

			If a GUID property is specified in properties
			it is used to find the service; otherwise Type,
			SecurityClass, and type-specific properties such as
			WiFi.SSID are used to find any existing service.
			If no service is located in memory a new one is
			created with the supplied properties.

			All provided parameters are applied to the in
			memory service regardless of errors.  But if an
			error occurs while setting a property and the
			service object was created as a result of this
			call it is removed.  In the event of multiple
			errors the first error code is returned by
			this call.

			See the Service Properties section for a list of
			properties and constraints on property values.
			See also GetService.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.TechnologyNotAvailable

		object ConfigureServiceForProfile(object profile,
						  dict properties)

			Create or update the configuration of a WiFi
			service within a specific profile.  This is
			similar to "ConfigureService" above, except
			that this might not change the state of the
			current service.  A matching service is found
			by first looking for a service with matching
			"GUID" property if specified, then by using
			the "Mode", "SSID", and "SecurityClass" properties
			from |properties|.

			If a matching service is found but its current
			profile supersedes the specified profile, a new
			profile entry is written with the specified
			properties.  This method can be used for
			configuring a service in the default profile
			while a separate configuration exists in the
			user profile.  In this scenario, no configured
			properties in the user profile entry will be
			copied to the default profile, and the user
			profile remains unchanged.  Moreover, the
			matching service will still refer to the user
			profile.

			A second example usage for this method is creating
			a copy of the current service from the default
			profile into the user profile.  If a matching
			service exists but its current profile antecedes
			the specified profile, the configuration of the
			current service is first copied to the new profile
			without removing the entry in the default profile.
			The service is then assigned to the new profile
			and the specified properties are then applied to
			the service and saved to the new profile, leaving
			the original profile intact.  This differs from the
			behavior of setting the "Profile" property on the
			service via the SetProperty or ConfigureService
			methods, which remove the configuration from the
			old profile.

			In situations where a matching service is not found,
			the service isn't associated with a profile, or the
			specified profile is already associated with the
			matched service, the behavior of this method mimics
			that of ConfigureService.

			Currently this method is only supported for WiFi
			services.  The specified profile must already
			be loaded and on the Manager's profile stack.
			If the "Profile" parameter is set in the properties
			dictionary, it must match the profile parameter.

			This method returns the object path of the created
			or modified service, in cases where a matching
			service will refer to the specified profile.
			Otherwise it returns the special path "/" to signify
			that although the operation succeeded, there is
			no matching service that refers to this profile.

			Possible Errors: [service].Error.IllegalOperation
					 [service].Error.InternalError
					 [service].Error.InvalidArguments
					 [service].Error.NotFound
					 [service].Error.TechnologyNotAvailable

		void FindMatchingService(dict properties)

			Find a service that matches all the properties
			and returns the object identifier associated
			with it.  If no service exists in memory that
			matches these arguments, an error is returned.

			See also GetService and ConfgiureService.

			Possible Errors: [service].Error.NotFound

		object GetService(dict properties)

			Return the object path of a service after
			applying any requested configuration changes.
			If no service exists it is created.

			If a GUID property is specified in properties
			it is used to find the service; otherwise Type,
			Security, and type-specific properties such as
			WiFi.SSID are used to find any existing service.
			If no service is located in memory a new one is
			created with the supplied properties.

			All provided parameters are applied to the service
			regardless of errors.  But if an error occurs
			while setting a property and the service was
			created as a result of this call it is removed.
			In the event of multiple errors the first error
			code is returned by this call.

			See the Service Properties section for a list of
			properties and constraints on property values.
			See also ConfigureService.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.PermissionDenied
					 [service].Error.InternalError
					 [service].Error.InvalidNetworkName
					 [service].Error.InvalidPassphrase
					 [service].Error.TechnologyNotAvailable

		void SetDebugTags(string taglist)

			Set the debug tags that are enabled for logging to
			syslog. "taglist" is a list of valid tag names
			separated by "+".  Shill silently ignores
			invalid flags.

		string GetDebugTags()
			Get the list of enabled debug tags. The list is
			represented as a string of tag names separated
			by "+".

		string ListDebugTags()
			Get the list of all debug tags that can be enabled.
			The list is represented as a string of tag names
			separated by "+".

		string GetServiceOrder()

			Return a ','-separated string listing known technologies
			in priority ordering.

			For example, the default ordering would be returned as:
				"ethernet,wifi,cellular"

		void SetServiceOrder(string mask)

			Set the technology priority based on a provided
			','-separated list of technologies, sorted from highest
			priority to lowest.

			The list may contain the following services:
				{ ethernet, wifi, cellular }
			Technologies not included are assigned the lowest
			priority.

			Technology priority changes occur immediately.

			Possible Errors: [service].Error.InvalidArguments

		void RecheckPortal()

			Retest the portal state of all connected services
			if a check is not currently in progress.

		dict GetNetworksForGeolocation()

			Returns a dictionary (array of dictionary entries)
			containing information about visible cellular and WiFi
			networks which may be then used for Geolocation.
			Each key is a string representing a network type (cellular
			or WiFi), and the value itself is an array of dictionaries
			mapping string key-value pairs. Each of these
			(sub) dictionaries contains information about one single
			network for Geolocation.
			If there are several network devices of a particular
			type, this method will return all of the information
			from all of the devices.
			For more details, see:
			https://developers.google.com/maps/documentation/business/geolocation/


		boolean SetNetworkThrottlingStatus(bool enabled,
						   uint32 upload_rate_kbits,
						   uint32 download_rate_kbits)

			Enables or disables network throttling to limit bandwidth
			consumed by the device. Applies to all interfaces. Both
			rates are specified in kbits/s. If throttling already
			exists, this will override current throttling settings.

		void ScanAndConnectToBestServices()

			Forces a WiFi scan if a WiFi device is available as a
			way of ensuring that networks recently configured can be
			found. Then connects to the highest priority service
			available for each technology as determined by sorting
			all services independent of their current connectivity
			state. Shill does not normally disrupt an active
			connection for a given technology, even when a higher
			priority network becomes available for that technology.
			Calling this method will trigger a switch to higher
			priority services for each available technology.
			Note: The scan applies only to a WiFi device, however
			connecting to the highest priority service will happen
			for all technologies.

		void ConnectToBestServices()

			Deprecated: Use ScanAndConnectToBestServices instead.
			For each technology present, connect to the "best"
			service available, as determined by sorting all
			services independent of their current connectivity
			state.  As a general rule, shill does not disrupt
			current connectivity even if "better" connectivity
			options appear.  This method allows this rule to be
			violated for a single instance for each technology
			type.

		void CreateConnectivityReport()

			For each connected service, perform a single
			connectivity trial and report the results to the log.
			This connectivity test does not affect Service state.

		void ClaimInterface(string claimer_name, string interface_name)

			Assign the ownership of a device |interface_name| to the
			claimer |claimer_name|. The specified device will be
			added to the block list. Any current connection on that device
			will be terminated, and shill will stop managing that device.

		void ReleaseInterface(string claimer_name, string interface_name)

			Take the ownership of a device |interface_name| from
			claimer |claimer_name| back to shill. The specified device
			will be removed from the block list and managed by shill.

		void SetDNSProxyAddresses(array{string} addresses)

			Assigns the IPv4 and IPv6 addresses of the dns-proxy
			service. When set, shill will use these addresses as
			the system name servers rather than those specified by
			the relevant service.

			If the array is empty, DNS proxy address(es) will be
			cleared and the name servers from the current default
			network will be used. This is the same behavior as
			ClearDNSProxyAddresses.

			This IPv4 address is enforced to be within a predetermined
			system local subnet.

		void ClearDNSProxyAddresses()

			Clear any DNS proxy address stored in shill. When this
			is called, shill will use the name servers from the
			current default network for /etc/resolv.conf instead of
			the proxy address(es).

		void DNSProxyDOHProviders(array{string, string} providers)

			Assigns the DNS-over-HTTPS service providers for use by
			the dns-proxy service. URLs of the secure
			DNS service endpoints are used as keys. If applicable,
			each value is a comma-separated list of the IP addresses
			(both v4 and v6 are supported) of the standard DNS name
			servers that map to the secure DNS service provider.

		void AddPasspointCredentials(object profile, dict properties)

			Adds a set of Passpoint credentials to |profile|. The credentials
			will be used to match and connect to compatible Wi-Fi networks.
			Credentials cannot be added to the default Profile.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotFound
					 [service].Error.OperationFailed

		void RemovePasspointCredentials(object profile,
	                                        dict properties)

			Remove Passpoint credentials that matches the all
			property of |properties|. This removes all services
			associated with the removed credentials.

			Possible Errors: [service].Error.InvalidArguments
					 [service].Error.NotFound
					 [service].Error.OperationFailed

Signals		PropertyChanged(string name, variant value)

			This signal indicates a changed value of the given
			property.

		StateChanged(string state)

			This signal is similar to the PropertyChanged signal
			for the State property.

			It exists for application state only care about the
			current state and so can avoid to be woken up when
			other details changes.

Properties	object ActiveProfile [readonly]

			Object path of the top-most Profile in the Profile stack.

		string AlwaysOnVpnPackage [readwrite]

			Package name of an Android VPN app to use as the "AlwaysOnVpn"
			connection. When this property is not "", all user traffic will be
			blackholed unless we are connected to an ARC VPN using the
			corresponding Android app.

		boolean ArpGateway [readwrite]

			Specifies whether the DHCP client should be configured to perform
			the extra step of performing an ARP of the gateway IP address.  This
			provides a level of assurance that the issued IP address is valid
			and not blocked in some manner unknown by the DHCP server.

		array{string} AvailableTechnologies [readonly]

			The list of technologies for which at least one Device exists (see
			the caveat in Devices). Order carries no meaning and is not
			guaranteed to be consistent.

		string CheckPortalList [readwrite]

			The list of technologies for which "captive portal checking"--really
			just connectivity quick checks--is enabled.  This is a
			comma-separated string; e.g. "wifi,cellular,vpn".

		array{string} ClaimedDevices [readonly]

			The list of the names of devices that have been claimed by the
			current DeviceClaimer (if it exists).

		array{string} ConnectedTechnologies [readonly]

			The list of technologies for which at least one Device is connected
			(see the caveat in Devices). Order carries no meaning and is not
			guaranteed to be consistent.

		string ConnectionState [readonly]

			The state of the highest ranked connected service.  The value of
			this property is "idle" if there are no connected services.
			Otherwise this can be any of the connected service states, e.g,
			"ready" or "online".

		object DefaultService [readonly]

			The object path of the connected Service with the highest
			priority. If there is no connected Service, returns the "/" object
			path.

		string DefaultTechnology [readonly]

			The technology of the DefaultService.

		array{object} Devices [readonly]

			List of physical Device object paths. No virtual Devices are
			contained in this list. Order carries no meaning and is not guaranteed
			to be consistent.

		string DHCPProperty.Hostname [readwrite]

			Optional setting to configure DHCP requests.  Some DHCP servers may
			register a DNS entry on behalf of this hostname; others may just
			make available a table for administrators to tell what machines are
			on their network.

			The default for this name is empty, which means that the system will
			not report a hostname.  When this property is set it will be
			persisted in the default profile.

		bool DisableVHT [readwrite]

			Disables 802.11ac Very High Throughput (VHT) connections, reverting
			to 802.11n.

		array{string} EnabledTechnologies [readonly]

			The list of technologies for which at least one Device is enabled
			(see the caveat in Devices). Order carries no meaning and is not
			guaranteed to be consistent.

		string IgnoredDNSSearchPaths [readwrite]

			A comma-separated list of DNS domain suffixes which should be
			ignored when creating a DNS search list from DHCP-provided
			parameters. This list will be consulted every time DHCP information
			is updated (while connecting to a network, or when a DHCP lease is
			renewed).

		string NoAutoConnectTechnologies [readwrite]

			The list of technologies for which auto-connect is disabled. This is
			a comma-separated string, e.g. "cellular,wifi".

		string PortalFallbackUrlsString [readwrite]

			Comma-separated string of URLs used for HTTP connectivity
			verification after the first connectivity verification trial. The
			order of these URLs has no meaning.

		string PortalHttpUrl [readonly]

			The URL to use when doing connectivity verification over HTTP.

		string PortalHttpsUrl [readonly]

			The URL to use when doing connectivity verification over HTTPS.

		string ProhibitedTechnologies [readwrite]

			The list of technologies whose Devices should be disabled and
			prohibited from being enabled. This is a comma-separated string,
			e.g. "cellular,wifi". All Devices that are one of these technology
			types will be immediately disabled persistently, and when a new
			Device of this type appears, it will be disabled by default.
			Attempts to enable such a Device using the EnableTechnology will
			fail. Order carries no meaning and is not guaranteed to be
			consistent.

		array{object} Profiles [readonly]

			List of Profile object paths in the Profile stack. Elements are
			ordered from top of the stack to bottom.

		array{object} Services [readonly]

			List of Service object paths that are visible. The first Service is
			always the primary connected Service on the system (if there is
			one). Services in a more connected state always come before Services
			in a less connected state. In order:
			  * "online"
			  * "ready"
			  * "no-connectivity", "redirect-found", or "portal-suspected"
			  * "association" or "configuration"
			  * "idle" or "disconnecting"
			  * "failure"

			Between unconnected Services, connectable Services come before
			unconnectable Services. Within the same state "bucket", Services are
			ordered based on Technology type (see SetServiceOrder). Services in
			the same state bucket and with the same Technology type are then
			compared with the following (in order):
			  * "Priority"
			  * "Source"
			  * "ManagedCredentials"
			  * "AutoConnect"
			  * "Security" (currently only for WiFi)
			  * "Profile" ordering
			  * If the Service has ever connected
			  * "Strength"

			Finally, if two Services have all of those in common, the Service
			that was created first will be placed before the other Service.

			This list represents the available services for the current selected
			profile. If the profile gets changed then this list will be updated.

			The same list is available via the profile object itself. It is just
			provided here for convenience of applications only dealing with the
			current active profile.

		array{object} ServiceCompleteList [readonly]

			Complete list of Service object paths, including those that are not
			currently visible.  For example, WiFi Services that are stored in a
			loaded Profile but cannot currently be connected are presented in
			this list.

			The Services are listed in the same Service sorting order as the
			"Services" property above.  Change events for this property are not
			emitted.

		array{object} ServiceWatchList [readonly]

			List of Service object paths that are in a 'non-idle' state. This
			indicates the set of Services which are currently listed as
			associating, configuring, or some other state other than idle,
			failure, disconnecting, or unknown.  This allows a caller to use
			this property indication to track which Services should be monitored
			for state changes.

			The Services are listed in the same Service sorting order as the
			"Services" property above, and a change event for this property is
			emitted every time the Service list is reordered, even if this list
			has not changed.

		string SupportedVPNTypes [readonly]

			The list of supported vpn types. This is a comma-separated string;
			e.g. "l2tpipsec,openvpn,thirdpartyvpn,arcvpn". The possible value of
			list items are "l2tpipsec", "openvpn", "thirdpartyvpn", "arcvpn", and
			"wireguard".

		string State [readonly]

			The global connection state of a system. Possible values are
			"online" if at least one connection exists and "offline" if no
			device is connected.

		array{string} UninitializedTechnologies [readonly]

			The list of uninitialized technologies. An uninitialized technology
			is a technology that has at least one Device that is not initialized
			yet (i.e.  the Device object is not created yet). The strings are
			the same as the ones from the service types.

		bool WakeOnLanEnabled [readwrite]

			Specifies whether the Wake on LAN feature should be enabled on new
			Ethernet links. Currently connected links are un-affected.

		bool WiFi.GlobalFTEnabled [readwrite]

			Specifies whether or not 802.11r Fast BSS Transition should be
			used.

		bool WiFi.ScanAllowRoam [readwrite]

			Specifies whether or not a WiFi scan could trigger a
			roam if a better AP is found on the same network.

		array{string, string} DNSProxyDOHProviders [readonly]

			The DNS-over-HTTPS service providers. URLs of the secure
			DNS service endpoints are used as keys. If applicable,
			each value is a comma-separated list of the IP addresses
			(both v4 and v6 are supported) of the standard DNS name
			servers that map to the secure DNS service provider.
